SELECT SUM(population) FROM bbc |
SELECT region, SUM(population), SUM(area) FROM bbc GROUP BY region |
SELECT region, SUM(population), SUM(area) FROM bbc GROUP BY region HAVING SUM(area)>1000000 |
把 GROUP BY 加入 SQL 的原因是,合计函数(比如 SUM)在每次被调用后会返回所有列的合计,如果没有 GROUP BY,就无法计算每个单独列值组合的总和。
SELECT column,SUM(column) FROM table GROUP BY
column
Company | Amount |
---|---|
W3School | 6500 |
IBM | 5500 |
W3School | 7300 |
SELECT Company, SUM(Amount) FROM Sales
Company | SUM(Amount) |
---|---|
W3School | 19300 |
IBM | 19300 |
W3School | 19300 |
上面的代码是无效的,这是由于被返回的列没有进行部分合计。GROUP BY 子句能解决这个问题:
SELECT Company,SUM(Amount) FROM Sales GROUP BY Company
Company | SUM(Amount) |
---|---|
W3School | 13800 |
IBM | 5500 |
把 HAVING 加入 SQL 的原因是,WHERE 无法应用于合计函数,而如果没有 HAVING,就无法测试结果条件。
SELECT column,SUM(column) FROM table GROUP BY column HAVING SUM(column) condition value
Company | Amount |
---|---|
W3School | 6500 |
IBM | 5500 |
W3School | 7300 |
SELECT Company,SUM(Amount) FROM Sales GROUP BY Company HAVING SUM(Amount)>10000
Company | SUM(Amount) |
---|---|
W3School | 13800 |
cube操作符
要使用cube,首先要了解group by
其实cube和rollup区别不太大,只是在基于group by 子句创建和汇总分组的可能的组合上有一定差别,
cube将返回的更多的可能组合。如果在 group by 子句中有n个列或者是有n个表达式的话,
sqlserver在结果集上会返回2的n-1次幂个可能组合。
注意:
使用cube操作符时,最多可以有10个分组表达式
在cube中不能使用all关键字
例子:
我们在数据库统计中常常要查询以下情况:
如一个定单数据库,我们要知道每个定单的每个产品数量,每个定单的所有产品数量,所有定单的某一产品数量,所有定单所有产品总量这些汇总信息。这时使用cube就十分方便了。当然不需要这么多信息或者只想知道某一具体产品、具体某一定单,某一时间关系(前,后,之间)等等具体信息的话,只需在where中限定即可
先举一个例子,是所有情况的:
一个数据库表中记载了一个产品定购情况:
现共有三种产品(1,2,3),已经下了两个定单(1,2)
sql语句:
select productid,orderid SUM(quantity) AS total FROM order GROUP BY productid,orderid WITH CUBE
ORDER BY productid,orderid
运行后得到结果:
productid orderid total
null null 95 所有定单所有产品总量
null 1 30 定单1所有产品数量
null 2 65 定单2所有产品数量
1 null 15 所有定单产品1总量
1 1 5 定单1产品1数量
1 2 10 定单2产品1数量
2 null 35 所有定单产品2总量
2 1 10 定单1产品2数量
2 2 25 定单2产品2数量
3 null 45 所有定单产品3总量
3 1 15 定单1产品3数量
3 2 30