1

私は非常に基本的な平坦化を探しています。データベースには、従業員の各フィールドを別の行に提供するテーブルがあります。

EX 
  EMPLOYEE         GROUP_NAME
   81               BNEEO55
   81               BNELLIG
   81               LPKAPE
   81               HRFT
   90               BNRETINV
  ....

データを次のように報告するビューを作成したいと思います。

EMPLOYEE     Group1      Group2        Group3         Group4         Group5
81           BNEEO55     BNELLIG       LPKAPE         HRFT           NULL
90           NULL        NULL          NULL           NULL           BNRETINV

また

EMPLOYEE    BNEEO55     BNELLIG       LPKAPE         HRFT           BNRETINV
81          YES         YES           YES            YES            NO
90          NO          NO            NO             NO             YES 
4

1 に答える 1

4

データを PIVOT する必要があります。SQL-Server 2008 以降を使用している場合は、PIVOT 関数を使用できます。

CREATE TABLE #T (Employee INT, Group_name VARCHAR(50))
INSERT #T VALUES (81, 'BNEEO55'), (81, 'BNELLIG'), (81, 'LPKAPE'), (81, 'HRFT'), (90, 'BNRETINV')

SELECT  Employee, 
        COALESCE([BNEEO55],'No') AS [BNEEO55],
        COALESCE([BNELLIG],'No') AS [BNELLIG],
        COALESCE([BNRETINV],'No') AS [BNRETINV],
        COALESCE([HRFT],'No') AS [HRFT],
        COALESCE([LPKAPE],'No') AS [LPKAPE]
FROM    (   SELECT  *, 'Yes' [Data]
            FROM    #T
        ) d
        PIVOT
        (   MAX(Data)
            FOR Group_Name IN ([BNEEO55], [BNELLIG], [BNRETINV], [HRFT], [LPKAPE])
        ) pvt

ただし、データが変更されている場合は、動的に行う必要があるようです。次のようなものが機能します。

DECLARE @SQL NVARCHAR(MAX) = '',
        @Cols NVARCHAR(MAX) = ''

SELECT  @SQL = @SQL + ',' + QUOTENAME(Group_Name),
        @Cols = @Cols + ',COALESCE(' + QUOTENAME(Group_Name) + ',''No'') AS ' + QUOTENAME(Group_Name)
FROM    (   SELECT  DISTINCT Group_Name 
            FROM    #T
        ) T

SET @SQL = '
            SELECT  Employee, ' + STUFF(@Cols, 1, 1, '') + 
            'FROM   (   SELECT  *, ''Yes'' [Data]
                        FROM    #T
                    ) d
                    PIVOT
                    (   MAX(Data)
                        FOR Group_Name IN (' + STUFF(@SQL, 1, 1, '') + ')
                    ) pvt'

EXECUTE SP_EXECUTESQL @SQL

これにより、最初のクエリと同じクエリが作成されますが、新しいグループ名が追加されたときにクエリを変更する必要がないことを意味します。


編集

これをストアド プロシージャとして作成して呼び出すには、次のようにします。

CREATE TABLE T (Employee INT, Group_name VARCHAR(50))
INSERT T VALUES (81, 'BNEEO55'), (81, 'BNELLIG'), (81, 'LPKAPE'), (81, 'HRFT'), (90, 'BNRETINV')
GO
CREATE PROCEDURE PivotT
AS

DECLARE @SQL NVARCHAR(MAX) = '',
        @Cols NVARCHAR(MAX) = ''

SELECT  @SQL = @SQL + ',' + QUOTENAME(Group_Name),
        @Cols = @Cols + ',COALESCE(' + QUOTENAME(Group_Name) + ',''No'') AS ' + QUOTENAME(Group_Name)
FROM    (   SELECT  DISTINCT Group_Name 
            FROM    T
        ) T

SET @SQL = '
            SELECT  Employee, ' + STUFF(@Cols, 1, 1, '') + 
            'FROM   (   SELECT  *, ''Yes'' [Data]
                        FROM    T
                    ) d
                    PIVOT
                    (   MAX(Data)
                        FOR Group_Name IN (' + STUFF(@SQL, 1, 1, '') + ')
                    ) pvt'

EXECUTE SP_EXECUTESQL @SQL
GO
EXECUTE PivotT
于 2012-07-03T15:24:30.767 に答える