我正在尝试改进我的基本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()
函数
答案 0 :(得分:3)
首先,编写查询的正确方法是:
SELECT CustomerID, SUM(SubTotal)
FROM Sales.SalesOrderHeader
GROUP BY CustomerID;
对窗口函数使用SELECT DISTINCT
很聪明。但是,它会使查询过于复杂,性能会更差,并且会让读者感到困惑。
要按年度(每位客户)获取信息,只需将其添加到SELECT
和GROUP BY
:
SELECT CustomerID, YEAR(OrderDate) as yyyy, SUM(SubTotal)
FROM Sales.SalesOrderHeader
GROUP BY CustomerID, YEAR(OrderDate)
ORDER BY CustomerId, yyyy;
如果您确实希望获得带小计的单独行,请在GROUPING SETS
和ROLLUP
上进行研究。这些是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