问题描述
我有下表,其中有两个销售订单,每个销售订单都有不同数量的交易。
销售订单 | 交易 | 金额 |
---|---|---|
S1 | T1 | 20 |
S1 | T2 | 20 |
S2 | T1 | 15 |
S2 | T2 | 15 |
S2 | T3 | 15 |
问题是我根据 sql Server 表中的每个事务获取总销售订单金额,而实际上它们需要在事务数量之间平均分配,如下所示:
销售订单 | 交易 | 金额 |
---|---|---|
S1 | T1 | 10 |
S1 | T2 | 10 |
S2 | T1 | 5 |
S2 | T2 | 5 |
S2 | T3 | 5 |
我编写了以下查询:
SELECT SalesOrder,Transaction,Max(Amount) / (SELECT COUNT(Transaction) AS Transaction FROM Test_Table GROUP BY SalesOrder)
FROM Test_Table
GROUP BY SalesOrder,Transaction
但它给了我'子查询返回的值超过 1。当子查询跟随 =,!=,<,<=,>,>=
或子查询用作表达式时,这是不允许的。错误。有人能解释一下这是什么以及如何纠正这个错误吗?
解决方法
我认为你不需要 group by
,只是窗口函数:
SELECT SalesOrder,Transaction,Amount) / COUNT(*) OVER (PARTITION BY salesorder)
FROM Test_Table;
,
因为在子查询中你 GROUP BY SalesOrder
它为每个 SalesOrder
返回 1 行。
但您需要特定 SalesOrder
的交易数量。
使用 MAX() 和 COUNT() 窗口函数:
SELECT DISTINCT SalesOrder,MAX(Amount) OVER (PARTITION BY SalesOrder,Transaction) /
COUNT(*) OVER (PARTITION BY SalesOrder)
FROM Test_Table
如果 Amount
列的数据类型为 INTEGER,那么 SQL Server 将执行整数除法,因此您可能需要先乘以 1.0
,以便得到带有小数位的正确结果:
SELECT DISTINCT SalesOrder,1.0 * MAX(Amount) OVER (PARTITION BY SalesOrder,Transaction) /
COUNT(*) OVER (PARTITION BY SalesOrder)
FROM Test_Table
,
试试这个
SELECT SaleOrder,[Transaction],Max(Amount) / COUNT([Transaction]) over (partition by SaleOrder)
FROM Test_Table GROUP BY SaleOrder,[Transaction]