SQL Server Pivot-无法按列添加

时间:2018-08-23 21:08:48

标签: sql sql-server

我通常不使用数据透视表和固定存储过程。我认为问题是关键声明。

我有下表:

#status_totals
ProductName  Orders Status
-------------------------------
Product1     1      inprogress
Product1     1      inprogress
Product1     1      ordered
Product1     1      ordered
Product1     1      inprogress

这是我正在使用的sql语句。

select ProductName, ordered
from #status_totals
pivot (SUM(Orders) for Status in ([ordered])) as StatusTotals

这是结果

ProductName  ordered    
---------------------
Product1     NULL       
Product1     NULL       
Product1     1          
Product1     1          
Product1     NULL   

这不是我想要的。我应该有一行

ProductName  ordered    
---------------------
Product1     2

不确定如何获得想要的结果。

3 个答案:

答案 0 :(得分:0)

我将使用条件汇总函数,  CASE WHENsum做透视。

CREATE TABLE T(
  ProductName varchar(50),
  Orders int,
  Status varchar(50)
);



INSERT INTO T VALUES ('Product1',1,'inprogress');
INSERT INTO T VALUES ('Product1',1,'inprogress');
INSERT INTO T VALUES ('Product1',1,'ordered');
INSERT INTO T VALUES ('Product1',1,'ordered');
INSERT INTO T VALUES ('Product1',1,'inprogress');

查询1

SELECT ProductName  ,SUM(CASE WHEN Status = 'ordered' THEN Orders END) ordered
FROM T
GROUP BY ProductName  

Results

| ProductName | ordered |
|-------------|---------|
|    Product1 |       2 |

答案 1 :(得分:0)

为此无需使用PIVOT,您应该使用简单的CASE表达式和SUM

SELECT ProductName, 
       SUM(CASE WHEN [Status] = 'ordered' THEN Orders END) Ordered
FROM #status_totals
GROUP BY ProductName;

答案 2 :(得分:0)

要解决这个问题? 然后看起来像这样:

SELECT *
FROM
(
    SELECT ProductName, Orders, Status
    FROM #status_totals
    WHERE Status IN ('ordered')
) AS src
PIVOT 
(
   SUM(Orders) FOR Status IN ([ordered])
) AS pvt;

但是要获得预期的结果?
这应该已经足够了:

SELECT ProductName, SUM(Orders) AS [ordered]
FROM #status_totals
WHERE Status = 'ordered'
GROUP BY ProductName
ORDER BY ProductName;