从表中逐字段选择(sum(field) - max(field))

时间:2014-03-23 14:07:45

标签: sql

我有两张桌子:

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感谢的意思。

1 个答案:

答案 0 :(得分:0)

Prezzo分组时,每个不同的价格都会有一行,从Fornitori中的行汇总。然后,对于每一行,计算Prezzo的总和(这只是单个项的总和,因为您按Prezzo分组),以及最大值,然后从中减去这两个彼此。如果没有GROUP BY,所有行都会汇总,所有价格都会汇总,您可以得到所有价格的总和减去所有价格的最大值。

问题是:为什么要按Prezzo进行分组,然后使用聚合?通常,您按一列或多列分组,然后在其他列上使用聚合(即,不是您分组的列)。在我看来,您可能希望通过Prezzo之外的其他内容进行分组,或者,如果您确实希望按Prezzo分组(例如,获取有关每种不同价格的产品的信息) ),那么你想要聚合其他一些专栏。