-3

SQL Server 2008 で次のクエリを作成しました

SELECT dimUser.EmpFName, dimUser.EmpLName, dimUser.EmpStartDt, dimUser.MgrEmpFullName1, 
    dimUser.PrimaryJobName, dimUser.PrimaryOrgName, Org.Org_Name
FROM dimUser 
INNER JOIN tblEmpOrg AS fact 
  ON dimUser.ID = fact.EmpOrg_EmpFK 
INNER JOIN Org 
  ON fact.EmpOrg_OrgFK = Org.Org_PK

ユーザーごとに多くの異なる組織名があるため、データは複数の行を生成します。

Employee Name  Manager Name          Org_Name
Neil Jones     Elizabeth O'Donnell   USA 
Neil Jones     Elizabeth O'Donnell   AFG 
Neil Jones     Elizabeth O'Donnell   USA REG A

このクエリをピボットして、さまざまな組織の複数の列を生成するにはどうすればよいですか? IE 組織 1、組織 2、組織 3 など。

Employee Name  Manager Name         Org_NAME 1  Org_Name 2  Org_Name 3
Neil Jones     Elizabeth O'Donnell  USA         AFG         USA REG A
4

1 に答える 1

6

関数を使用しPIVOTてデータを変換できます。ただし、row_number()行データを列に変換するのに役立つように、各従業員に適用する必要があります。

各従業員の値の数がわかっている場合は、次のようなクエリをハードコーディングできます。

select [Employee Name],
  [Manager Name],
  Org_Name_1, 
  Org_Name_2, 
  Org_Name_3
from
(
  select [Employee Name], [Manager Name], [Org_Name],
    'Org_Name_'+cast(row_number() over(partition by [Employee Name] order by [Employee Name]) as varchar(50)) rn
  from yourtable
) src
pivot
(
  max([Org_Name])
  for rn in (Org_Name_1, Org_Name_2, Org_Name_3)
) piv;

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

ただし、従業員ごとの値の数が不明な場合は、org_name動的 SQL を使用する必要があります。

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

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(rn) 
                    from
                    (
                      select 'Org_Name_'+cast(row_number() over(partition by [Employee Name] order by [Employee Name]) as varchar(50)) rn
                      from yourtable
                    ) t
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT [Employee Name], [Manager Name],' + @cols + ' from 
             (
                select [Employee Name], [Manager Name], [Org_Name],
                  ''Org_Name_''+cast(row_number() over(partition by [Employee Name] order by [Employee Name]) as varchar(50)) rn
                from yourtable
            ) x
            pivot 
            (
                max(Org_Name)
                for rn in (' + @cols + ')
            ) p '

execute(@query)

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

どちらも結果を生成します。

| EMPLOYEE NAME |        MANAGER NAME | ORG_NAME_1 | ORG_NAME_2 | ORG_NAME_3 |
------------------------------------------------------------------------------
|    Neil Jones | Elizabeth O'Donnell |        USA |        AFG |  USA REG A |

注:yourtableをクエリに置き換えます

于 2013-02-27T11:31:40.667 に答える