我一直在尝试为以下查询创建一个支点:
select mainstate, customertypeid, count(1) as [counter] from customers group by customertypeid, mainstate
此查询应显示每个州的客户类型数量,它看起来像这样(按顺序排列并不重要):
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语句,
非常感谢!
答案 0 :(得分: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
答案 1 :(得分:1)
这个(可能是稍微编辑过的)应该为你做的工作没有case / sum / pivot。创建临时表,插入起始数据,然后根据有多少客户类型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 ['+@s+'] varchar(5)'
execute sp_executesql @xx1
set @xx1 = 'update a set a.['+@s+'] = coalesce(b.counter,0) from #temp a, customers b where b.customertypeid = '+@s+' and a.state = b.state'
execute sp_executesql @xx1
FETCH NEXT FROM myCursor into @S
End
Close myCursor
DEALLOCATE myCursor
select * from #temp