2017-08-24 136 views
1

有什麼方法可以透視2基於列?我已經完成了使用1列作爲支點基礎的動態數據透視,但這一次我無法弄清楚。T-SQL樞軸有多個列基礎樞軸

這裏是我的表模式:

CREATE TABLE [dbo].[ProdOrders] 
(
    [ItemCode] [nvarchar](50) NULL, 
    [ReleasedDate] [date] NULL, 
    [PlanQty] [float] NULL, 
    [ActualQty] [float] NULL 
) 

而且我填的表格:

INSERT INTO [dbo].[ProdOrders]([ItemCode], [ReleasedDate], [PlanQty], [ActualQty]) 
VALUES 
    ('0D203-22882-079','2017-08-18',12654,4218), 
    ('0D203-22882-079','2017-08-23',15758,5253), 
    ('0D203-22882-079','2017-08-27',26263,8754), 
    ('0D203-22882-079','2017-09-02',7354,2451), 
    ('0D301-05422-079','2017-08-18',31144,10381), 
    ('0D301-05422-079','2017-08-18',20612,6871), 
    ('0D301-05422-079','2017-08-23',25765,8588), 
    ('0D301-05422-079','2017-08-29',19582,6527), 
    ('0D301-05422-079','2017-09-04',15459,5153), 
    ('0D203-22882-079','2017-09-22',5232,1744), 
    ('0D203-22882-079','2017-09-28',13236,4412), 
    ('0D203-22882-079','2017-10-03',7693,2564), 
    ('0D301-05422-079','2017-09-23',24735,8245), 
    ('0D301-05422-079','2017-09-27',19561,6520), 
    ('0D301-05422-079','2017-09-06',23755,7918), 
    ('0D301-05422-079','2017-09-14',23755,7918), 
    ('0D301-05422-079','2017-09-17',29694,9898), 
    ('0D203-22882-079','2017-11-01',2263,754), 
    ('0D203-22882-079','2017-10-21',15693,5231), 
    ('0D203-22882-079','2017-10-20',15968,5323), 
    ('0D203-22882-079','2017-10-25',10521,3507), 
    ('0D301-05422-079','2017-10-21',23755,7918), 
    ('0D301-05422-079','2017-10-29',17816,5939), 
    ('0D301-05422-079','2017-11-01',15612,5204), 
    ('0D301-05422-079','2017-10-03',20816,6939), 
    ('0D301-05422-079','2017-10-11',15612,5204), 
    ('0D301-05422-079','2017-10-18',26020,8673) 

這是預期的輸出:

ItemCode 201708-Plan 201708-Actual 201709-Plan 201709-Actual 201710-Plan 201710-Actual 201711-Plan 201711-Actual 
    --------------- ----------- ------------- ----------- ------------- ----------- ------------- ----------- ------------- 
    0D203-22882-079 54,674  18,225  25,822  8,607  49,875  16,625  2,263  754 
    0D301-05422-079 97,103  32,367  136,959 45,652  104,020  34,673  15,612  5,204 

我有轉動的PlanQtyActualQty基於使用年份和月份與實際和數量級聯的發佈日期。

我創建了一個支點劇本,但我得到一個錯誤:

DECLARE @PivotColumns AS NVARCHAR(MAX) 
SELECT @PivotColumns = COALESCE(@PivotColumns + ',','') + QUOTENAME([YRMOPLAN]) + QUOTENAME([YRMOACT]) 
FROM (SELECT DISTINCT CONVERT(char(6), cast([ReleasedDate] as date), 112) + 'Plan' as [YRMOPLAN] 
,CONVERT(char(6), cast([ReleasedDate] as date), 112) + 'Actual' as [YRMOACT] FROM [dbo].[ProdOrders]) as PivotQuery ORDER BY [YRMOPLAN] 
SELECT @PivotColumns 

DECLARE @query NVARCHAR(MAX) 
SET @query = 'SELECT * FROM 
      (
      SELECT ItemCode, CONVERT(char(6), cast([ReleasedDate] as date), 112) + ''Plan'' as [YRMOPLAN] 
      ,CONVERT(char(6), cast([ReleasedDate] as date), 112) + ''Actual'' as [YRMOACT], PlanQty,ActualQty 
      FROM ProdOrders 
      ) x 
      PIVOT 
      (
       SUM(PlanQty) 
       FOR [YRMOPLAN] IN (' + @PivotColumns + ') 
      ) p 

      PIVOT 
      (
       SUM(ActualQty) 
       FOR [YRMOACT] IN (' + @PivotColumns + ') 
      ) p2;' 
EXEC SP_EXECUTESQL @query 

這是錯誤我得到:

Msg 102, Level 15, State 1, Line 10
Incorrect syntax near '201708Actual'

+0

[SQL服務器:動態樞軸超過5列]的可能的複製(https://stackoverflow.com/questions/18657214/sql-server-dynamic-pivot-over-5-columns) –

回答

1

你錯過bewteen [計劃]逗號和[實際雖然構建@PivotColums

DECLARE @PivotColumns AS NVARCHAR(MAX) 
SELECT @PivotColumns = COALESCE(@PivotColumns + ',','') + QUOTENAME([YRMOPLAN])+',' + QUOTENAME([YRMOACT]) 
FROM (SELECT DISTINCT CONVERT(char(6), cast([ReleasedDate] as date), 112) + 'Plan' as [YRMOPLAN] 
,CONVERT(char(6), cast([ReleasedDate] as date), 112) + 'Actual' as [YRMOACT] FROM [dbo].[ProdOrders]) as PivotQuery ORDER BY [YRMOPLAN] 
SELECT @PivotColumns 

但是,您可以簡體lify這一點

Declare @SQL varchar(max) = ' 
Select * 
From (
     Select A.ItemCode 
       ,B.* 
     From [dbo].[ProdOrders] A 
     Cross Apply (values (convert(varchar(6),ReleasedDate,112)+''-Plan'',PlanQty) 
          ,(convert(varchar(6),ReleasedDate,112)+''-Actual'',ActualQty) 
        ) B (Item,Value) 
    ) S 
Pivot (sum([Value]) For [Item] in (' + Stuff((Select Distinct ','+QuoteName(convert(varchar(6),ReleasedDate,112)+'-Plan') 
                   +','+QuoteName(convert(varchar(6),ReleasedDate,112)+'-Actual') 
               From [dbo].[ProdOrders] 
               Order By 1 
               For XML Path('')),1,1,'') + ')) p' 
Exec(@SQL); 
--Print @SQL 

返回

enter image description here

+0

謝謝。但是我嘗試了簡化的查詢,但發生了一個錯誤:消息195,級別15,狀態10,行11 'concat'不是公認的內置函數名稱。 消息137,級別15,狀態2,行16 必須聲明標量變量「@SQL」。 Msg 137,Level 15,State 2,Line 17 必須聲明標量變量「@SQL」。 –

+0

@EliseoJr 2012年之前更新 –

+0

我明白了。謝謝約翰。是的,我正在使用2012. –