web-dev-qa-db-ja.com

選択に基づいて列のピボットを解除する

動的SQLを使用せずに、列名がselectを介して実行されるUnpivot操作を実行することは可能ですか?

これを試しましたが失敗します。

SELECT *
FROM [dbo].[Report]
UNPIVOT
(
  Value
  FOR WeekName IN 
  (
      SELECT COLUMN_NAME FROM information_schema.columns c
      WHERE c.TABLE_NAME = 'Report'
      AND ORDINAL_POSITION > 1
      ORDER BY ORDINAL_POSITION
  )
) u
2
Muflix

UNPIVOTは、テーブルのピボットを解除するための最良の方法ではありません。値を使用したCROSSAPPLYははるかに優れた方法です。

申し訳ありませんが、これについてはDynamicSQLから逃れることはできないと思います。

このコードは、テーブル全体を動的にアンピボットします。

DECLARE @tablename VARCHAR(255) = 'Employee'
DECLARE @schemaname  VARCHAR(255) = 'HumanResources'
DECLARE @qrystr NVARCHAR(4000) = ''

;with cte
    AS
    (
    SELECT
        c.column_id
        ,c.name
    FROM
        sys.objects o 
            INNER JOIN sys.columns c 
                ON
                o.object_id = c.object_id
    WHERE
        o.name = @tablename
        AND
        SCHEMA_NAME(o.schema_id) = @schemaname
    )
SELECT
@qrystr = 
'SELECT A.[' + (SELECT name FROM cte WHERE column_id = 1) + '] 
    ,C.Name
    ,C.Val
FROM
    [' + @schemaname + '].[' + @tablename + '] A

    CROSS APPLY (VALUES ' +
    STUFF((SELECT ',' + '(CAST(['+name + '] AS VARCHAR(255)),''' + name + ''')' FROM cte WHERE column_id > 1 ORDER BY column_id FOR XML PATH ('')), 1, 1, '') 
    + ' ) C(Val,Name)'

EXEC (@qrystr)
3
pacreely