编辑:如果有其他条件(请参阅下文,添加代码),则代码为IN(25,26)但不是27时,如何处理此问题。
我有一系列记录,其中一些是qty< 0,其他qty>我有下面的字段1和2,我的目标是获得字段3:
qtyRemaining = SUM(qty)
逻辑是,如果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
应为0,但如果qtyRemaining
,qty > 0
(甚至记录SUM(qty where trcode IN(25, 26))
)分组{ {1}}。
我遇到的问题是我无法做到:
qty < 0
...因为SQL要求我将qty放在一个组中,因为它在ref_x
函数之外。但如果我这样做:
CASE
WHEN qty < 0
THEN 0
ELSE SUM(QTY)
END [QtyRemaining]
......这不是我想要的。有没有办法做到这一点,我只是没有看到?请帮忙!
答案 0 :(得分:2)
我认为你最好的选择是在这里使用窗口功能。聚合并不是你真正想要的,因为你似乎想要显示所有行:
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;
希望这有帮助。
答案 1 :(得分:0)
您可以使用下面的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
答案 2 :(得分:0)
我认为这就是你要找的东西:
select ref_x, qty, sum(qty) over(partition by ref_x) as qtyRemaining
from table;
sum(qty)over(partition by ref_x)就是诀窍