编辑:当有另一个条件时,一个人将如何处理(请参见下文,添加代码(和qtyRemaining = SUM(qty)
(25,26(而不是27。
我有一系列记录,有些是QTY<0,其他数量> 0。我在下面有1和2的字段1和2
ref_x qty code qtyRemaining(goal)
--------------------------------------------------
TKAB030AA 0 25 0
TKAB030AA 0 25 0
TKAB030AA -3 26 0
TKAB030AA -197 26 0
TKAB030AA 3 27 -200
TKAB030AA 197 27 -200
逻辑是,如果qty < 0
,则qtyRemaining
应为0,但是如果qty > 0
,SUM(qty where trcode IN(25, 26))
(甚至记录了qty < 0
(通过ref_x
进行分组。
我遇到的问题是我无法做:
CASE
WHEN qty < 0
THEN 0
ELSE SUM(QTY)
END [QtyRemaining]
...因为SQL希望我将数量放在组中,因为它在SUM()
功能之外。但是如果我这样做:
, SUM(CASE WHEN qty < 0 THEN 0 ELSE QTY END) [QtyRemaining]
...这也不是我想要的。有什么方法可以做到这一点吗?请帮助!
我认为您最好的选择是在此处使用窗口函数。聚合并不是您真正追求的,因为您似乎来自问题要显示所有行:
SELECT ref_x, qty
, CASE WHEN qty <= 0 THEN 0 ELSE SUM(qty) OVER ( PARTITION BY ref_x ) END AS [QtyRemaining]
FROM mytable;
您可以通过使用聚合并将表格加入本身获得相同的答案,但这是更多的打字:
WITH t2 AS (
SELECT ref_x, SUM(qty) AS total_qty
GROUP BY ref_x
)
SELECT t1.ref_x, t1.qty
, CASE WHEN t1.qty <= 0 THEN 0 ELSE t2.total_qty END AS [QtyRemaining]
FROM t1 INNER JOIN t2
ON t1.ref_x = t2.ref_x;
编辑新条件:
我认为您需要这个:
SELECT ref_x, qty
, CASE WHEN qty <= 0 THEN 0 ELSE SUM(CASE WHEN code IN (25,26) THEN qty ELSE 0 END) OVER ( PARTITION BY ref_x ) END AS [QtyRemaining]
FROM mytable;
希望这会有所帮助。
我认为这就是您要寻找的:
select ref_x, qty, sum(qty) over(partition by ref_x) as qtyRemaining
from table;
sum(qty((ref_x分区(是技巧
您可以从下面的cte
中受益。请尝试:
;with cte (ref_x, qtyRemaining) as (
Select ref_x, sum(qty) as qtyRemaining
from table
group by ref_x
)
select t.ref_x, t.qty, (case when t.qty > 0 then cte.qtyRemaining else 0 end)
from table t
inner join cte on t.ref_x = cte.ref_x