2

SectionNames私は次のように呼ばれるテーブルを持っています

SectionIDSectionCodeサブセクション
   1xYz個人
   2xYzファミリー
   3CYDフレンズ
   4PCPOレベル1
   5PCPOレベル2
   6PCPOレベル3

後で。したがって、将来的には、セクションコードごとに1つ以上のサブセクションを追加できます。

SectionNamesそして、上記のテーブルEmployeeと従業員データを含むテーブルの参照テーブルであるテーブルがもう1つあります。

IDEmployeeIDSectionIDコスト    
1 1 1 $ 200
2 1 2 $ 300    
3 1 3 $ 40
4 1 4 $ 10
515レベルなし
616レベルなし
7 1 7 $ 20
818レベルなし
919レベルなし

したがって、これらのテーブルからの出力は次のようになります。

EmployeeID     Individual_xyz_Cost    Family_xyz_Cost    Friends_xyz_cost  level1_PCPO_cost  level2_PCPO_Cost
   1                 $200                 $300               $400              $10             NoLevel

従業員テーブルに存在する従業員レコードはほとんどありません。そして、これを動的にしたいと思います。将来、セクションにRelatives追加されたサブセクションがもう1つ呼び出されたXYZ場合、クエリはを返すはずRelatives_XYZ_Costです。

このクエリを動的に作成するにはどうすればよいですか?

4

1 に答える 1

6

この関数を使用してPIVOT、データを列から行に変換する必要があります。列である必要がある値の数が不明な場合は、動的SQLを使用する必要があります。

最初に静的バージョンまたはハードコードされたバージョンを確認してから、動的SQLバージョンに変換する方が簡単です。静的バージョンは、値の数がわかっている場合に使用されます。

select *
from
(
  select e.employeeid,
    s.subsection +'_'+s.sectioncode+'_Cost' Section,
    e.cost
  from employee e
  inner join sectionnames s
    on e.sectionid = s.sectionid
) src
pivot
(
  max(cost)
  for section in (Individual_xYz_Cost, Family_xYz_Cost,
                  Friends_CYD_Cost, level1_PCPO_Cost,
                  level2_PCPO_Cost, level3_PCPO_Cost)
) piv;

SQL FiddlewithDemoを参照してください。

クエリを柔軟にする必要がある場合は、動的SQLを使用するようにこれを変換します。

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

select @cols = STUFF((SELECT ',' + QUOTENAME(subsection +'_'+sectioncode+'_Cost') 
                    from SectionNames
                    group by subsection, sectioncode, sectionid
                    order by sectionid
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT employeeid,' + @cols + ' 
              from 
             (
                select e.employeeid,
                  s.subsection +''_''+s.sectioncode+''_Cost'' Section,
                  e.cost
                from employee e
                inner join sectionnames s
                  on e.sectionid = s.sectionid
            ) x
            pivot 
            (
                max(cost)
                for section in (' + @cols + ')
            ) p '

execute(@query)

SQL FiddlewithDemoを参照してください

両方の結果は次のとおりです。

| EMPLOYEEID | INDIVIDUAL_XYZ_COST | FAMILY_XYZ_COST | FRIENDS_CYD_COST | LEVEL1_PCPO_COST | LEVEL2_PCPO_COST | LEVEL3_PCPO_COST |
----------------------------------------------------------------------------------------------------------------------------------
|          1 |                $200 |            $300 |              $40 |              $10 |         No Level |         No Level |
于 2013-03-14T16:18:55.587 に答える