如何在T-SQL中对多个条件求和?
我正在努力提高基本的SQL查询技能,并在SQL Server 2012中使用AdventureWorks2012示例数据库。我在(按分区)上使用了如何在T-SQL中对多个条件求和?,sql,sql-server,Sql,Sql Server,我正在努力提高基本的SQL查询技能,并在SQL Server 2012中使用AdventureWorks2012示例数据库。我在(按分区)上使用了SUM()如下: SELECT DISTINCT SUM(SubTotal) OVER (PARTITION BY CustomerID), CustomerID FROM Sales.SalesOrderHeader 为了获得每个客户的总销售价值,我想使用year(OrderDate)对客户和年份的小计进行求和,以提取订单日期的
SUM()
如下:
SELECT DISTINCT
SUM(SubTotal) OVER (PARTITION BY CustomerID), CustomerID
FROM
Sales.SalesOrderHeader
为了获得每个客户的总销售价值,我想使用year(OrderDate)
对客户和年份的小计进行求和,以提取订单日期的年份部分
首先,我似乎无法使用订单日期的年份部分独立于客户按年份求和,因此这种方法无论如何都不起作用
其次,我看不到任何使用多个分区标准的方法
我怀疑我的经验不足导致我以错误的方式思考这个问题,因此理论方法和具体解决方案一样有用
我想我正在寻找功能上类似于Excel的SUMIFS()
函数的东西首先,编写查询的正确方法是:
SELECT CustomerID, SUM(SubTotal)
FROM Sales.SalesOrderHeader
GROUP BY CustomerID;
在窗口函数中使用SELECT DISTINCT
,这很聪明。但是,它会使查询过于复杂,性能可能会较差,并且会让任何阅读它的人感到困惑
要按年度(针对每个客户)获取信息,只需将其添加到选择和分组依据中即可:
SELECT CustomerID, YEAR(OrderDate) as yyyy, SUM(SubTotal)
FROM Sales.SalesOrderHeader
GROUP BY CustomerID, YEAR(OrderDate)
ORDER BY CustomerId, yyyy;
如果您真的想得到单独的小计行,那么请研究分组集
和汇总
。这些是分组依据
的选项您应该使用分组依据
,而不是分区依据
,只要您需要针对特定列(如(customerid)进行聚合(sum/count/max
),如下所示
select customerId, sum(subTotal)
FROM sales.salesOrderHeader
group by customerId
编辑:包括缺少日期要求(回复评论)
如果要针对多个列进行计算,仍然可以使用相同的方法。只需在GROUPBY子句中将日期添加为GROUPBY 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
谢谢你,戈登,非常感谢-我想我是想在走路之前跑!我不知道标准GROUP BY的这些扩展,并将更深入地研究它们,尽管您的代码似乎做了我想要做的事情,因为我感谢Sami的快速响应,但这没有满足我根据日期和客户ID求和的要求。我确实理解您关于GROUP BY的观点,并将进一步探讨以改进我的(有限!)理解力