mysql - 我怎样才能对数据透视列的一部分进行 AVG 值计算?

标签 mysql sql

我做了一个这样的 SQL 查询:

SELECT
   tudeng.nimi, ROUND(AVG(
          CASE
            WHEN aine.nimetus = 'Kõrgem matemaatika I'
            THEN hinne.tulemus
            ELSE ''
          END
        ))
        AS KõrgemmatemaatikaI ,ROUND(AVG(
          CASE
            WHEN aine.nimetus = 'Füüsika I'
            THEN hinne.tulemus
            ELSE ''
          END
        ))
        AS FüüsikaI ,ROUND(AVG(
          CASE
            WHEN aine.nimetus = 'Raalprojekteerimine'
            THEN hinne.tulemus
            ELSE ''
          END
        ))
        AS Raalprojekteerimine , ROUND(AVG(
            CASE
              WHEN aine.nimetus = 'Tehniline graafika'
              THEN hinne.tulemus
              ELSE ''
            END
          ))
          AS Tehnilinegraafika
FROM
 tudeng

INNER JOIN
 aine_tudeng
ON
 tudeng.tudeng_id =  aine_tudeng.tudeng_id

INNER JOIN
 aine
ON
  aine.aine_id = aine_tudeng.aine_id

INNER JOIN
 hinne
ON
 hinne.aine_tudeng_id=aine_tudeng.aine_tudeng_id
GROUP BY
 tudeng.nimi

我有一个包含许多值的 hinne 表。我想根据 aine avg 值,但当前查询 avg 由所有乘数。

id  tulemus  kaal   liik   aine_tudeng_id
1      50     1     KT        1
2      80     1     KT        2
3      40     1     KT        3

 aine_tudeng_id tudeng_id aine_id
        1         1          1
        2         1          2
        3         1          3

我得到的结果:

nimi    KõrgemmatemaatikaI  FüüsikaI    Realprojekteerimine Tehnilinegraafika   
John            17            27             13                     0

我期望的结果:

nimi    KõrgemmatemaatikaI  FüüsikaI    Realprojekteerimine Tehnilinegraafika   
John            50            80             40                 0

有办法解决这个问题吗?

我的 SQL 数据结构:

CREATE TABLE IF NOT EXISTS `aine` (
  `aine_id` int(11) NOT NULL AUTO_INCREMENT,
  `nimetus` varchar(255) NOT NULL,
  PRIMARY KEY (`aine_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ;

--
-- Dumping data for table `aine`
--

INSERT INTO `aine` (`aine_id`, `nimetus`) VALUES
(1, 'Kõrgem matemaatika I'),
(2, 'Füüsika I'),
(3, 'Raalprojekteerimine'),
(4, 'Tehniline graafika');

-- --------------------------------------------------------

--
-- Table structure for table `aine_tudeng`
--

CREATE TABLE IF NOT EXISTS `aine_tudeng` (
  `aine_tudeng_id` int(11) NOT NULL AUTO_INCREMENT,
  `tudeng_id` int(11) NOT NULL,
  `aine_id` int(11) NOT NULL,
  PRIMARY KEY (`aine_tudeng_id`),
  KEY `tudeng_id` (`tudeng_id`),
  KEY `aine_id` (`aine_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ;

--
-- Dumping data for table `aine_tudeng`
--

INSERT INTO `aine_tudeng` (`aine_tudeng_id`, `tudeng_id`, `aine_id`) VALUES
(1, 1, 1),
(2, 1, 2),
(3, 1, 3);

-- --------------------------------------------------------

--
-- Table structure for table `hinne`
--

CREATE TABLE IF NOT EXISTS `hinne` (
  `hinne_id` int(11) NOT NULL AUTO_INCREMENT,
  `tulemus` int(11) NOT NULL,
  `kaal` float NOT NULL,
  `liik` varchar(200) NOT NULL,
  `aine_tudeng_id` int(11) NOT NULL,
  PRIMARY KEY (`hinne_id`),
  KEY `aine_tudeng_id` (`aine_tudeng_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ;

--
-- Dumping data for table `hinne`
--

INSERT INTO `hinne` (`hinne_id`, `tulemus`, `kaal`, `liik`, `aine_tudeng_id`) VALUES
(1, 50, 0, '1', 1),
(2, 80, 0, '1', 2),
(3, 40, 1, 'KT', 3);

-- --------------------------------------------------------

--
-- Table structure for table `tudeng`
--

CREATE TABLE IF NOT EXISTS `tudeng` (
  `tudeng_id` int(11) NOT NULL AUTO_INCREMENT,
  `nimi` varchar(255) CHARACTER SET utf8 COLLATE utf8_estonian_ci NOT NULL,
  `m_number` varchar(10) NOT NULL,
  PRIMARY KEY (`tudeng_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ;

--
-- Dumping data for table `tudeng`
--

INSERT INTO `tudeng` (`tudeng_id`, `nimi`, `m_number`) VALUES
(1, 'Raivo', 'AA'),
(2, 'Jüri', 'AB'),
(3, 'Jaak', 'BA'),
(4, 'Martin', 'BB');

--
-- Constraints for dumped tables
--

--
-- Constraints for table `aine_tudeng`
--
ALTER TABLE `aine_tudeng`
  ADD CONSTRAINT `aine_tudeng_ibfk_1` FOREIGN KEY (`tudeng_id`) REFERENCES `tudeng` (`tudeng_id`),
  ADD CONSTRAINT `aine_tudeng_ibfk_2` FOREIGN KEY (`aine_id`) REFERENCES `aine` (`aine_id`);

--
-- Constraints for table `hinne`
--
ALTER TABLE `hinne`
  ADD CONSTRAINT `hinne_ibfk_1` FOREIGN KEY (`aine_tudeng_id`) REFERENCES `aine_tudeng` (`aine_tudeng_id`);

最佳答案

答案是you have to eliminate zero values from AVG , 添加到 SQLFiddle .

AVG(NULLIF(field ,0))

例子:

ROUND(AVG(NULLIF(
          CASE
            WHEN aine.nimetus = 'Kõrgem matemaatika I'
            THEN hinne.tulemus
            ELSE 0
          END
        ,0)
        ))
        AS KõrgemmatemaatikaI 

关于mysql - 我怎样才能对数据透视列的一部分进行 AVG 值计算?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46643582/

相关文章:

mysql - 用于数据库设计的抽象/超/子类结构

PHP/MySQL 根据第二个表中 X 行中的 1 选择一个列表

sql - 甲骨文数据透视 : from rows into columns

SQL 查询 : Order by in UNION

mysql - 更好的查询来获取用户每月排名?

php - MySQL - 如何使用文件名作为查询的一部分?

mysql - SQL日期格式转换? [dd.mm.yy 到 YYYY-MM-DD]

MYSQL 删除和回滚

sql - NOT EXISTS、NOT IN 和 LEFT JOIN WHERE IS NULL 之间有什么区别?

c# - SQL 批量存储过程调用 C#