1

C#/MVC4 で LINQ または LAMBDA を使用して動的データをピボットしようとしましたが、非常に難しいという結論に達しました。

これは基本的に私がやりたいことです: ピボット

この例を使用して、既知の列名でこれを機能させることができました: http://geekswithblogs.net/malisancube/archive/2009/04/21/using-lambda-or-linq-for-pivot-tables.aspx

しかし、動的列でこれを行う例は見つかりません。

動的な列とは、これまでテーブルになかった別の Name と FieldType を持つ新しい行が存在する可能性があることを意味し、これも列に変換する必要があります。

4

1 に答える 1

2

わからないLINQので、SQL Server ストアド プロシージャで使用できるバージョンを提供します。このタイプのデータ変換は、PIVOT. SQL Server 2008+を使用しているため、関数を使用できます。

変換する値がわかっている場合は、値をハードコーディングできます。

SELECT nodeid, rowid,[FirstName], [LastName], [Title]
FROM
(
    SELECT nodeid, rowid, name, value
    FROM yourTable
) x
PIVOT
(
   max(value)
   for name in ([FirstName], [LastName], [Title])
)p

デモで SQL Fiddle を参照してください

次に、値の数が不明な場合は、動的 SQL を実装できます。

DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(name) 
                    from yourtable
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT nodeid, rowid,' + @cols + ' from 
             (
                SELECT nodeid, rowid, name, value
                FROM yourTable
            ) x
            pivot 
            (
                max(value)
                for name in (' + @cols + ')
            ) p '

execute(@query)

デモで SQL Fiddle を参照してください

どちらも結果を返します。

| NODEID | ROWID | FIRSTNAME | LASTNAME |  TITLE |
--------------------------------------------------
|      1 |     1 |    Alfred |   Beagle | (null) |
|      1 |     2 |    Freddy |   (null) | (null) |
|      1 |     3 |    (null) |     Grey |   Sir. |
于 2013-01-07T16:28:41.993 に答える