0

私は次のクエリのピボットを作成しようとしています:

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

*追記:CASE+SUMステートメントに戻りたくありません。

どうもありがとう!

4

2 に答える 2

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
于 2013-02-26T20:11:09.890 に答える
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
于 2013-02-26T20:11:20.603 に答える