2013-02-26 67 views
0

我一直在试图创建以下查询枢轴:在一组通过查询

select mainstate, customertypeid, count(1) as [counter] from customers group by customertypeid, mainstate 

此查询应显示每个国家尽可能多的客户类型,它看起来像这样(ORDER BY没有按”牛逼事):

State|customertypeid|counter 
    UT  3   200 
    CA  3   500 
    NY  3   300 
    UT  2   100 
    CA  2   200 
    NY  2   120 
    UT  1    20 
    CA  1    50 
    NY  1    30 

我试着使用PIVOT如下(我敢肯定,我错了):

SELECT * 
FROM (select mainstate, customertypeid, count(1) as [counter] from customers where customertypeid in (1,2,3) and mainstate != '' group by customertypeid, mainstate) as NonPivotedDataForReport2 
PIVOT 
(
COUNT([counter]) 
FOR mainstate IN ([# of Amb],[# Whole Sale Customers],[# Retail Customers]) 
) AS PivotedDataForReport2 

我得到这个:

customertypeid|type1|type2|type3 
     1   0  0  0 
     2   0  0  0 
     3   0  0  0 

,报告应该是这样的:

State|type1|type2|type3 
UT  20 100 200 
CA  50 200 500 
NY  30 120 300 

* PS:我真的不想回去CASE + SUM声明,

非常感谢!

回答

3

这样做:

SELECT mainstate [State], 
     [1] type1, 
     [2] type2, 
     [3] type3 
FROM ( SELECT mainstate, customertypeid, COUNT(1) [counter] 
     FROM customers 
     WHERE customertypeid in (1,2,3) 
     AND mainstate != '' 
     GROUP BY customertypeid, mainstate) as NonPivotedDataForReport2 
PIVOT(SUM([counter]) FOR customertypeid IN ([1],[2],[3])) AS PivotedDataReport2 
+0

+1:该死,打我吧。这是正确的答案。 – 2013-02-26 20:17:25

+0

谢谢,这项工作的魅力。 – 2013-02-26 20:25:52

+0

@AngelEscobedo听起来不错:-) – Lamak 2013-02-26 20:26:26

1

这(可能稍微改动过),应该为你做的工作不区分/和/支点。创建临时表,插入起始数据,然后根据有多少个客户类型ID来动态添加列。

declare @s varchar(10), @xx1 varchar(500) 

select distinct state into #temp from customers 

DECLARE myCursor CURSOR FOR SELECT distinct customertypeid from customers 
open MyCursor 
FETCH NEXT FROM myCursor into @S 
WHILE @@FETCH_STATUS = 0 
    begin 
     set @xx1 = 'alter table #temp add ['[email protected]+'] varchar(5)' 
     execute sp_executesql @xx1 
      set @xx1 = 'update a set a.['[email protected]+'] = coalesce(b.counter,0) from #temp a, customers b where b.customertypeid = '[email protected]+' and a.state = b.state' 
      execute sp_executesql @xx1 
     FETCH NEXT FROM myCursor into @S 
    End 
Close myCursor 
DEALLOCATE myCursor 

select * from #temp 
+0

如果您知道前面的列并且客户ID不变,Lamak的答案是更简单的方法。如果您事先并不了解这些列,那么动态添加列将是您的方式。 – JohnZ 2013-02-26 20:20:02