sql >> データベース >  >> RDS >> Sqlserver

特定の列に基づく行から別のデータ構造にデータを変換する方法

    アンピボット/ピボットを使用して、必要な結果を得ることができます。結果を取得する方法はいくつかあります。値の数が限られている場合はクエリをハードコーディングできますが、値の数が不明な場合は動的 SQL を使用する必要があります。

    UNPIVOT プロセスは c1 の複数の列を変換します などを複数行に。データが複数の行にある場合は、PIVOT 関数を簡単に適用できます。アンピボット関数または CROSS APPLY を使用して、複数の列からデータを変換できます:

    select id, col ='Service'+Service+'_'+col+'_'+cast(seq as varchar(10)), valuefrom( select id, service, c1, cn , row_number() over (サービスごとの ID によるパーティション) seq from yourtable) tcross apply( select 'c1', c1 union all select 'cn', cn) c (col, value)  

    デモによる SQL Fiddle を参照してください。 .相互適用により、データが次の形式に変換されます:

    <プレ>| ID |コール |値 || 1 | ServiceA_c1_1 | 5 || 1 | ServiceA_cn_1 | 3 || 1 | ServiceB_c1_2 | 2 || 1 | ServiceB_cn_2 | 1 || 2 | ServiceA_c1_1 | 9 || 2 | ServiceA_cn_1 | 4 |

    データがこの形式になったら、PIVOT を適用できます:

    select id, ServiceA_c1_1, ServiceA_cn_1, ServiceB_c1_2, ServiceB_cn_2from( select id, col ='Service'+Service+'_'+col+'_'+cast(seq as varchar(10)), value from ( select id, service, c1, cn , row_number() over(サービスごとに ID で分割) seq from yourtable ) t cross apply ( select 'c1', c1 union all select 'cn', cn ) c (col, value)) dpivot((ServiceA_c1_1、ServiceA_cn_1、ServiceB_c1_2、ServiceB_cn_2)の列の最大(値)) piv;  

    デモによる SQL Fiddle を参照してください。 .

    値の数が不明な場合は、上記のクエリを動的 SQL に変換できます。

    DECLARE @cols AS NVARCHAR(MAX), @query AS NVARCHAR(MAX)select @cols =STUFF((SELECT ',' + QUOTENAME('Service'+Service+'_'+col+'_'+) cast(seq as varchar(10))) from ( select service, row_number() over(partition by id order by service) seq from yourtable )d cross apply ( select 'c1', 1 union all select 'cn', 2 ) c (col, so) group by seq, Service, col, so order by seq, so FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)') ,1,1,' ')set @query ='SELECT id, ' + @cols + ' from ( select id, col =''Service''+Service+''_''+col+''_''+cast(seq as varchar(10) ))、値から( select id, service, c1, cn , row_number() over(partition by id order by service) seq from yourtable ) t cross apply ( select ''c1'', c1 union all select ''cn'', cn ) c (col, value) ) x pivot ( max(value) for col in (' + @cols + ') ) p 'execute sp_executesql @query;  

    デモによる SQL Fiddle を参照してください。 .両方とも結果が得られます:

    <プレ>| ID |サービスA_C1_1 |サービスA_CN_1 |サービスB_C1_2 |サービスB_CN_2 || 1 | 5 | 3 | 2 | 1 || 2 | 9 | 4 | (ヌル) | (ヌル) |


    1. PythonはMySQLコネクタを使用してfetchallでハングします

    2. Symfony2:国ごとに都市を一覧表示

    3. PandasデータフレームをDjangoモデルに書き込む方法

    4. SQLPlusでのクエリの出力のフォーマット