如何在T-SQL中汇总多个条件?

时间:2016-05-11 15:57:23

标签: sql sql-server

我正在尝试改进我的基本SQL查询技能并使用SQL Server 2012中的AdventureWorks2012示例数据库。我使用过这样的SUM() OVER(PARTITION BY)

SELECT DISTINCT 
    SUM(SubTotal) OVER (PARTITION BY CustomerID), CustomerID
FROM 
    Sales.SalesOrderHeader

要获得每位客户的总销售额,不过我想按客户和客户总计SubTotal。年使用YEAR(OrderDate)仅提取订单日期的年份部分。

首先,我似乎无法使用订单日期的年份部分来逐年独立于客户,因此这种方法无论如何都不会起作用。

其次,我无法使用多种分区标准。

我怀疑我缺乏经验导致我以错误的方式思考这个问题,因此理论方法与特定解决方案一样有用。

我想我正在寻找与Excel SUMIFS()函数

功能类似的功能

2 个答案:

答案 0 :(得分:3)

首先,编写查询的正确方法是:

SELECT CustomerID, SUM(SubTotal)
FROM Sales.SalesOrderHeader
GROUP BY CustomerID;

对窗口函数使用SELECT DISTINCT很聪明。但是,它会使查询过于复杂,性能会更差,并且会让读者感到困惑。

要按年度(每位客户)获取信息,只需将其添加到SELECTGROUP BY

SELECT CustomerID, YEAR(OrderDate) as yyyy, SUM(SubTotal)
FROM Sales.SalesOrderHeader
GROUP BY CustomerID, YEAR(OrderDate)
ORDER BY CustomerId, yyyy;

如果您确实希望获得带小计的单独行,请在GROUPING SETSROLLUP上进行研究。这些是GROUP BY的选项。

答案 1 :(得分:1)

如果您需要针对特定​​列(例如(customerid))的聚合(group by),则应使用PARTITION BY代替sum/count/max

select customerId, sum(subTotal)
FROM sales.salesOrderHeader
group by customerId

修改:包括缺少日期要求(对评论的回复)

如果您希望针对多个列进行计算,您仍然可以采用相同的方式进行计算。只需将date分组添加为group by customerId, saleDate

即可
select customerId, sum(subTotal)
,saleDate //=> you can miss it (date) from selection if you want to
FROM sales.salesOrderHeader
group by customerId, saleDate