SQL SUM(QTY),但仅适用于QTY>的记录0

时间:2018-03-29 17:22:47

标签: sql-server group-by sum case

编辑:如果有其他条件(请参阅下文,添加代码),则代码为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,但如果qtyRemainingqty > 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]

......这不是我想要的。有没有办法做到这一点,我只是没有看到?请帮忙!

3 个答案:

答案 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)就是诀窍