查询返回26878行数据,这是上面查询返回的部分结果:
ProductID OrderDate LineTotal -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
714 2008-05-21 00:00:00.000 99.980000
859 2007-11-03 00:00:00.000 48.980000
923 2007-11-23 00:00:00.000 14.970000
712 2007-12-22 00:00:00.000 62.930000
795 2007-10-14 00:00:00.000 2443.350000
950 2007-07-01 00:00:00.000 2462.304000
795 2007-11-06 00:00:00.000 2443.350000
877 2007-11-19 00:00:00.000 15.900000
713 2007-10-01 00:00:00.000 99.980000
860 2008-05-31 00:00:00.000 48.980000
961 2008-05-01 00:00:00.000 36242.120880
在上面的示例程序中,Group by 子句中用到了ProductID列与OrderDate列,SQL Server基于ProductID和OrderDate二者组合的唯一性,返回LineTotal的值,并为其设置别名SummarizedLineTotal。如果你查看程序的输出,你会发现SQL Server 对数据进行分组后,返回的结果并没有特定的顺序,如果你需要返回结果按照一定顺序排序,你需要使用ORDER BY 子句,就像我在下面代码中展示的那样。
SELECT D.ProductID , H.OrderDate
, SUM(LineTotal) AS SummarizedLineTotal
FROM AdventureWorks2012.Sales.SalesOrderDetail D
JOIN AdventureWorks2012.Sales.SalesOrderHeader H
ON D.SalesOrderId = H.SalesOrderID
GROUP BY ProductID, OrderDate
ORDER BY SummarizedLineTotal DESC;
在上面的代码中,我按照SummorizedLineTotal降序对结果集进行排序,此列的值通过Group BY子句分组后对LineTotal使用聚合函数Sum得到。我对结果按照SummorizedLineTotal 的值降序排列。如果你运行此程序,你可以得出LineTotal 数量最高的ProductID和OrderDate。
对没有任何值的数据进行分组
有时候你会需要对一些记录中包含空值的数据进行分组操作。当你在SQL Server 执行此类操作时,它会自动假设所有NULL值相等。让我看一下下面的示例程序
CREATE TABLE NullGroupBy (OrderDate date, Amount Int); INSERT INTO NullGroupBy values (NULL,100),
('10-30-2014',100),
('10-31-2014',100),
(NULL,100);
SELECT OrderDate, SUM(Amount) as TotalAmount
FROM NullGroupBy
GROUP BY OrderDate;
DROP TABLE NullGroupBy;
When I run this code I get the following output:
OrderDate TotalAmount
-- -- -- -- -- -- -- -- -- -- -
NULL 200
2014-10-30 100
2014-10-31 100
在上面的程序中,我首先创建并填充了一个NullGroupBy表.在这个表中,我放置了四个不同的行,第一行和最后一行的orderDate列值为NULL,其他两列的orderDate值不同。从上面的输出结果可以看到,SQL Server 在分组时将OrderDate为NULL的两行聚集为一行处理。










