新手SQL Pivot查询

时间:2017-06-13 14:06:54

标签: sql-server pivot

长时间听众,第一次来电...

我有一张表(追踪器),如下所示:

ID | Works Order    |Activity   |Status
---|----------------|-----------|------
1  | W123456789-001 |10A        |GOOD
2  | W123456789-002 |10A        |GOOD
3  | W123456789-003 |10A        |SCRAP
4  | W123456789-001 |20A        |GOOD
5  | W123456789-002 |20A        |GOOD

...工程订单号W123456789-001由实际工单号组成; W123456789,后面是部件号; 001.'Activites'固定为10A,20A,30A& 110A,状态为'GOOD'或'SCRAP'。我想总结一下&输出如下:

Works Order  |10A |20A |30A |110A
-------------|----|----|----|----
W123456789   |2   |2   |0   |0    

... col 10,20,30& 110A是每项活动的“好”的计数。

我可以使用以下代码获得大部分内容;

select [WO_Part],[10A G],[20A G],[30A G],[110AG]
from
(
  select
  [Activity],
  LEFT([WOPart],10) AS [WO_Part],
  iIf([Status]='GOOD ',1,0) AS [STATUS],
  [ACTIVITY]+LEFT([STATUS],1) AS [CONCAT]
  from Tracker
) d
pivot
(
  SUM([Status])
  for [CONCAT] in ([10A G],[20A G],[30A G],[110AG])
) piv;

但是,每个Works Order我得到多行,每个活动的结果分布在一行,如下所示:

Works Order  |10A |20A |30A |110A
-------------|----|----|----|----
W123456789   |2   |0   |0   |0 
W123456789   |0   |2   |0   |0

如何更改查询以便将结果合并到一行?

Works Order  |10A |20A |30A |110A
-------------|----|----|----|----
W123456789   |2   |2   |0   |0 

提前谢谢!

1 个答案:

答案 0 :(得分:1)

使用pivotFROM子句中的额外列会产生额外的行。因此,您需要注意选择的内容:

select [WO_Part], [20A G],[30A G],[110AG]
from (select LEFT([WOPart], 10) AS [WO_Part],
             (case when [Status] = 'GOOD ' then 1 else 0 end) AS [STATUS],
             [ACTIVITY]+LEFT([STATUS],1) AS [CONCAT]
      from Tracker
     ) d
pivot (SUM([Status])
       for [CONCAT] in ([20A G],[30A G],[110AG])
     ) piv;

这种行为是我更喜欢条件聚合的一个原因。