按问题分区的 SQL-Sum

Bla*_*yre 3 sql-server

我写了一篇与此类似的声明。我是 SQL 新手,想知道如何或是否可以使用SUM(___)over(partition by ___) 该 PartID 的所有 NonUsableTotal 零件库存求和。

问题是这f.Netflag是一个数值,可以1 or 0将其定义为可用或不可用。

这是声明:

select distinct 
       l.whse,
       l.partid,
       i.descr,
       l.qty,
       case when f.Netflag=0 then 'NONUsable' else 'Usable' end as UsableStatus,
       SUM(l.qty*f.Netflag) over (partition by l.partid) as TotalUsable
from   location l (nolock)  
join   inventory i (nolock) 
on     l.partid=i.partid
join   loctable f (nolock) 
on     l.whse=f.whse
Run Code Online (Sandbox Code Playgroud)

这是我希望结果的样子:

+-------+--------+-----+------------+-----------+--------------+ 
|Partid |  Whse  | Qty |UsableStatus|TotalUsable|TotalNonUsable|
+-------+--------+-----+------------+-----------+--------------+     
 134       INSP     10    Usable         30            20
 134       RRR      15    NONUsable      30            20
 134       VVV      20    Usable         30            20
 134       QRR      5     NONUsable      30            20
Run Code Online (Sandbox Code Playgroud)

我感谢你的帮助谢谢。

ype*_*eᵀᴹ 7

你可以CASE在里面使用一个表达式SUM()

SELECT  
    l.whse, l.partid, i.descr, l.qty,

    CASE WHEN f.Netflag = 0 THEN 'NONUsable' ELSE 'Usable' END 
        AS UsableStatus,
    SUM(CASE WHEN f.Netflag = 0 THEN l.qty ELSE 0 END) 
      OVER (PARTITION BY l.partid) AS TotalNonUsable,
    SUM(CASE WHEN f.Netflag = 0 THEN 0 ELSE l.qty END) 
      OVER (PARTITION BY l.partid) AS TotalUsable
FROM
    location l 
  JOIN inventory AS i ON l.partid = i.partid
  JOIN loctable AS f ON l.whse = f.whse ;
Run Code Online (Sandbox Code Playgroud)

顺便说一句,我不明白您为什么需要DISTINCT在查询中。