我有两张桌子:
CREATE TABLE IF NOT EXISTS `prodotti` (
`ID` smallint(3) NOT NULL,
`Denominazione` varchar(15) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
INSERT INTO `prodotti` (`ID`, `Denominazione`) VALUES
(111, 'latte'),
(222, 'uova');
CREATE TABLE IF NOT EXISTS `fornitori` (
`ID` int(3) NOT NULL,
`CF` varchar(5) NOT NULL,
`date` varchar(8) NOT NULL,
`Prezzo` int(3) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
INSERT INTO `fornitori` (`ID`, `CF`, `date`, `Prezzo`) VALUES
(111, 'AAAAA', '22/11/09', 100),
(222, 'AAAAA', '22/11/09', 200),
(222, 'BBBBB', '28/10/09', 400),
(111, 'CCCCC', '30/12/07', 100),
(222, 'CCCCC', '30/12/07', 200);
现在这里有一些sql查询:
SELECT P.ID, COUNT(*)
FROM prodotti P,
(SELECT (SUM(Prezzo) - MAX(Prezzo)) AS T
FROM Fornitori
GROUP BY
prezzo
)F
WHERE F.T <200
GROUP BY
P.ID
但我有一些问题,
SELECT (
SUM( Prezzo ) - MAX( Prezzo )
) AS T
FROM Fornitori
此返回600
,但为什么要添加GROUP BY prezzo
,结果返回100 200 0
?什么是WHERE F.T <200
感谢的意思。
答案 0 :(得分:0)
按Prezzo
分组时,每个不同的价格都会有一行,从Fornitori
中的行汇总。然后,对于每一行,计算Prezzo
的总和(这只是单个项的总和,因为您按Prezzo
分组),以及最大值,然后从中减去这两个彼此。如果没有GROUP BY
,所有行都会汇总,所有价格都会汇总,您可以得到所有价格的总和减去所有价格的最大值。
问题是:为什么要按Prezzo
进行分组,然后使用聚合?通常,您按一列或多列分组,然后在其他列上使用聚合(即,不是您分组的列)。在我看来,您可能希望通过Prezzo
之外的其他内容进行分组,或者,如果您确实希望按Prezzo
分组(例如,获取有关每种不同价格的产品的信息) ),那么你想要聚合其他一些专栏。