3

現在、いくつかの行を列に PIVOT しようとしています。問題は、利用可能な行数が常にわからないことです。例を見てみましょう:

Values_Table                         Columns_Table
------------                         -----------
ID                                   ID
ColumnsTableID                       GroupID
Value                                ColumnName

結果"

Columns_Table
---------------
ID   |   GroupID   |   ColumnName
---------------------------------     
0        1             Cats
1        1             Dogs
2        1             Birds
3        2             Pontiac
4        2             Ford
5        3             Trex
6        3             Raptor
7        3             Triceratops
8        3             Kentrosaurus

静的ピボットの SQL FIDDLE 例。私は動的ピボットを達成しようとしています - http://sqlfiddle.com/#!3/2be82/1

したがって、ここに私のジレンマがあります。このシナリオでは、GroupID に基づいて、不明な数の列をピボットできるようにしたいと考えています。

たとえば、GroupID 3 のすべての行を列に PIVOT できるようにしたいと考えています。groupID 3 に含まれる行数を知らずにこれを行う必要があります。

データベースの設計は決まっているので、それについてはどうすることもできません。私にできることは、私が持っているもので作業することだけです:(

つまり、この例では groupID に基づいて、不明な数の行を列に PIVOT するというこのタスクを達成する方法について、誰か提案がありますか?

4

1 に答える 1

5

事前に値を把握できない場合は、動的 SQLの使用を検討する必要があります。これにより、実行される SQL 文字列が作成されます。これは、クエリの実行時に列のリストを認識している必要があるため必要です。

コードは次のようになります。

DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX),
    @groupid as int

set @groupid = 3

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(GroupName) 
                    from Columns_Table
                    where groupid = @groupid
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT ' + @cols + ' 
            from 
            (
              SELECT B.GroupName, A.Value
                , row_number() over(partition by a.ColumnsTableID
                                    order by a.Value) seq
              FROM Values_Table AS A 
              INNER JOIN Columns_Table AS B 
                ON A.ColumnsTableID = B.ID
              where b.groupid = '+cast(@groupid as varchar(10))+' 
            ) p
            pivot 
            (
                min(P.Value)
                for P.GroupName in (' + @cols + ')
            ) p '

execute sp_executesql @query;

SQL Fiddle with Demoを参照してください。groupid が 3 の場合、結果は次のようになります。

|   KENTROSAURUS |     RAPTOR |     TREX |    TRICERATOPS |
| whatisthiseven | Itsaraptor | Jurassic | landbeforetime |
|         (null) |       zomg |     Park |         (null) |
于 2013-09-18T15:08:05.420 に答える