在SQL Server

时间:2016-09-07 18:51:58

标签: sql-server sum case

我有很多有状态的产品记录。

我想按状态计算记录,并将这些结果作为列。我尝试了大小写,但是我的重复行的状态不同。

            Received   StandBy    Stocked    Pending
Product-1          2      NULL       NULL       NULL
Product-2          NULL     25       NULL       NULL
Product-1          NULL      5       NULL       NULL

我想要这样的东西

            Received   StandBy    Stocked    Pending
Product-1          2         5       NULL       NULL
Product-2          NULL     25       NULL       NULL

这是我尝试没有成功的查询:

    SELECT  
        --COALESCE(StatusID, 0) AS StatusID,  --=1,2
        ProductID,
        ProductNumber,
        DATEPART(hour,p.ArrivalDate) as ArrivalHour,
        DATEPART(minute,p.ArrivalDate) as ArrivalMinute,
        ProductWarehouseID,
        SUM(CASE WHEN StatusID = 1 THEN 1 END) AS Received,
        SUM(CASE WHEN StatusID = 2 THEN 1 END) AS StandBy,
        SUM(CASE WHEN StatusID = 3 THEN 1 END) AS Stocked,
        SUM(CASE WHEN StatusID = NULL THEN 1 END) AS Pending
    FROM Product AS p
    GROUP BY 
        ProductID,
        ProductNumber,
        DATEPART(hour, p.ArrivalDate),
        DATEPART(minute, p.ArrivalDate),
        ProductWarehouseID

2 个答案:

答案 0 :(得分:1)

我相信您已经将部分查询输出提供给您的解决方案。如果我的理解是正确的,您可能需要对结果使用聚合运算符。大纲在这里:

;WITH Temp AS
(   
    --Keep your current query here
)
SELECT ProductID, MAX(Received), MAX(StandBy), MAX(Stocked), MAX(Pending) 
FROM Temp 
GROUP BY ProductID --and any other grouping columns

答案 1 :(得分:0)

我认为在Sql 2000之后,当concat null在MsSql服务器中的默认设置时,你的关键绊脚点是null + 1 = null。您可以通过更改null concat设置的设置来解决您的问题。或者包括"否则0"其他人在此帖之前发布的语法。