2015-04-02 51 views
2

這是我的表格。如何使用動態T-SQL數據透視表更改輸出

CREATE TABLE tpivot 
    ([col1] varchar(80), [col2] varchar(80), [col3] varchar(80), [col4] varchar(80), [col5] varchar(80)) 
; 

INSERT INTO tpivot 
    ([col1], [col2], [col3], [col4], [col5]) 
VALUES 
    ('Datum', 'EC', 'Mastercard', 'Postfinance', 'VISA'), 
    ('01.12.2014', '-204.9', '-88', '0', '-19'), 
    ('02.12.2014', '-352.9', '0', '79.9', '-20'), 
    ('03.12.2014', '-105', '-182', '0', '-436'), 
    ('04.12.2014', '-371', '-122,9', '-751', '-343') 

; 

我的目標是打開表格,使輸出看起來像這樣。

col1   col2   col3  col4  col5 
Datum  01.12.2014 02.12.2014 03.12.2014 04.12.2014 
EC   -204.9  -352.9  -105  -371 
Mastercard -88   0   -182  -112.9 
Postfinance 0   -79.9  0   -751 
VISA   -19   -20   -436  -346 

我需要一個動態數據透視表,因爲我從每次可能有不同數量列的csv導入表。

有人可以幫助我嗎?我甚至不能獲取靜態樞軸工作:(

感謝

+0

請幫助我這個:( – user2210516 2015-04-02 10:39:46

+0

爲什麼不改造現有的CSV在導入之前?例如在Excel中,你可以打開csv,轉置整個數據矩陣並保存回來,有時候用輸入格式比使用錯誤工具更容易改變輸入格式,使用varchars混合不同的數據類型並輸出數據集不是一個好的做法。 試圖改變你解決這個任務的方式 – teran 2015-04-02 12:57:25

+0

這不是真正的樞軸轉動。你從列「col1」 - 「col5」開始,你所需的輸出具有相同的列。 – funkwurm 2015-04-02 13:59:06

回答

1

這裏是我的動態SQL的解決方案。

IF OBJECT_ID('tPivot') IS NOT NULl 
    DROP TABLE tpivot; 

CREATE TABLE tpivot 
    (ID INT IDENTITY(1,1), [col1] varchar(100), [col2] varchar(100), [col3] varchar(100), [col4] varchar(100), [col5] varchar(100)); 
INSERT INTO tpivot 
    ([col1], [col2], [col3], [col4], [col5]) 
VALUES 
    ('Datum', 'EC', 'Mastercard', 'Postfinance', 'VISA'), 
    ('01.12.2014', '-204.9', '-88', '0', '-19'), 
    ('02.12.2014', '-352.9', '0', '79.9', '-20'), 
    ('03.12.2014', '-105', '-182', '0', '-436'), 
    ('04.12.2014', '-371', '-122,9', '-751', '-343'); 

DECLARE @ColList VARCHAR(MAX), 
     @IdList VARCHAR(MAX); 

SELECT @ColList = COALESCE(@ColList + ',','') + QUOTENAME(A.COLUMN_NAME), 
     @IdList = COALESCE(@IdList + ',','') + QUOTENAME(ROW_NUMBER() OVER (ORDER BY ORDINAL_POSITION)) 
FROM INFORMATION_SCHEMA.COLUMNS A 
WHERE TABLE_NAME = 'tPivot' 
     AND COLUMN_NAME ! ='ID' 

--SELECT @ColList 
--SELECT @IdList 


EXEC (
'WITH CTE 
AS 
(
    SELECT * 
    FROM 
    (
     SELECT ID, 
       Column_Name, 
       ROW_NUMBER() OVER (PARTITION BY ID ORDER BY col) row_num, 
       val 
     FROM tPivot A 
     INNER JOIN (SELECT Column_Name AS COLUMN_NAME, ORDINAL_POSITION FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = ''tPivot'') B 
     ON A.ID = B.ORDINAL_POSITION - 1 
     UNPIVOT 
     (
      val for col in (' + @colList + ') 
     ) unpvt 
    ) A 
    PIVOT 
    (
     MAX(val) FOR column_name IN (' + @colList + ') 
    ) pvt 
) 

SELECT * 
FROM 
(
    SELECT ID, 
      row_num, 
      coalesce(' + @colList + ') val 
    FROM cte 
) A 
PIVOT 
(
    MAX(val) FOR ID IN (' + @IdList + ') 
) pvt' 
) 
+0

作品很有魅力,非常感謝。呵呵對我來說這並不容易,所以如果你想幫助我,我會很感激。 – user2210516 2015-04-07 07:51:34

+0

我明白。我在編寫動態SQL時習慣於使用TERRIBLE。這是所有關於一次採取一步和練習!因此,我所做的就是編寫我的腳本,然後查找哪些部分需要「動態」,如不斷變化的列名稱數量。我把這些變量。然後在我的腳本週圍添加單引號,並開始放入我的動態變量。然後,我選擇「我的代碼」並在新的查詢窗口中運行返回的代碼。調試它並重試,直到它工作。一旦我開始工作,我將SELECT更改爲EXEC('我的代碼'),瞧!動態SQL誕生了! :) – Stephan 2015-04-07 11:28:50