SQL Server数据汇总五招轻松搞定

2020-07-10 08:12:26易采站长站整理

查询返回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的两行聚集为一行处理。

相关文章 大家在看