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



编辑:当有另一个条件时,一个人将如何处理(请参见下文,添加代码(和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 > 0SUM(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

最新更新