我做了一个像这样的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
表,其中包含许多值。我希望avg
根据aine
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
我期待的结果:
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`);
有没有办法解决这个问题?
我的SQL数据结构:
videoView
答案 0 :(得分:1)
答案是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