2014-01-06 18 views
0

測試數據UNPIVOT數據有超過40只列

DECLARE @T table 
(ClientID INT, Dated DateTime,Value1 varchar(10),Value2 varchar(10), 
    Value3 varchar(10),Value4 varchar(10),Value5 varchar(10),Value6 varchar(10) 
    ,Value7 varchar(10),Value8 varchar(10),Value9 varchar(10) 
) 

INSERT INTO @T values 
(1,'2014-01-06 16:27:47.440','High','Low','Medium','High','Medium','Low','Medium','High','Low'), 
(2,'2014-01-06 16:27:47.440','Medium','High','Low','Medium','High','Low','Medium','Low','Medium'), 
(1,'2014-01-01 16:27:47.440','Medium','Low','High','Medium','Low','Medium','High','Low','Medium') 

SELECT * FROM @T 

╔══════════╦═════════════════════════╦════════╦════════╦════════╦════════╦════════╦════════╦════════╦════════╦════════╗ 
║ ClientID ║   Dated   ║ Value1 ║ Value2 ║ Value3 ║ Value4 ║ Value5 ║ Value6 ║ Value7 ║ Value8 ║ Value9 ║ 
╠══════════╬═════════════════════════╬════════╬════════╬════════╬════════╬════════╬════════╬════════╬════════╬════════╣ 
║  1 ║ 2014-06-01 16:27:47.440 ║ High ║ Low ║ Medium ║ High ║ Medium ║ Low ║ Medium ║ High ║ Low ║ 
║  2 ║ 2014-06-01 16:27:47.440 ║ Medium ║ High ║ Low ║ Medium ║ High ║ Low ║ Medium ║ Low ║ Medium ║ 
║  1 ║ 2014-01-01 16:27:47.440 ║ Medium ║ Low ║ High ║ Medium ║ Low ║ Medium ║ High ║ Low ║ Medium ║ 
╚══════════╩═════════════════════════╩════════╩════════╩════════╩════════╩════════╩════════╩════════╩════════╩════════╝ 

我的查詢

SELECT TOP 1 
     B.Value1 AS Historical_Value1, A.Value1 AS Recent_Value1 
    , B.Value2 AS Historical_Value2, A.Value2 AS Recent_Value2 
    , B.Value3 AS Historical_Value3, A.Value3 AS Recent_Value3 
    , B.Value4 AS Historical_Value4, A.Value4 AS Recent_Value4 
    , B.Value5 AS Historical_Value5, A.Value5 AS Recent_Value5 
    , B.Value6 AS Historical_Value6, A.Value6 AS Recent_Value6 
    , B.Value7 AS Historical_Value7, A.Value7 AS Recent_Value7 
    , B.Value8 AS Historical_Value8, A.Value8 AS Recent_Value8 
    , B.Value9 AS Historical_Value9, A.Value9 AS Recent_Value9 
FROM @T A INNER JOIN @T B 
ON A.ClientID = B.ClientID 
WHERE B.Dated < A.Dated 
ORDER BY A.Dated DESC, B.Dated DESC 

正如你可以看到我拉出最新的錄音爲所有的值並記錄在記錄在此之前。最近的價值和歷史價值分別。 它以下列格式返回我的數據。

電流輸出

╔═══════════════════╦═══════════════╦═══════════════════╦═══════════════╦═══════════════════╦═══════════════╦═══════════════════╦═══════════════╦═══════════════════╦═══════════════╦═══════════════════╦═══════════════╦═══════════════════╦═══════════════╦═══════════════════╦═══════════════╦═══════════════════╦═══════════════╗ 
║ Historical_Value1 ║ Recent_Value1 ║ Historical_Value2 ║ Recent_Value2 ║ Historical_Value3 ║ Recent_Value3 ║ Historical_Value4 ║ Recent_Value4 ║ Historical_Value5 ║ Recent_Value5 ║ Historical_Value6 ║ Recent_Value6 ║ Historical_Value7 ║ Recent_Value7 ║ Historical_Value8 ║ Recent_Value8 ║ Historical_Value9 ║ Recent_Value9 ║ 
╠═══════════════════╬═══════════════╬═══════════════════╬═══════════════╬═══════════════════╬═══════════════╬═══════════════════╬═══════════════╬═══════════════════╬═══════════════╬═══════════════════╬═══════════════╬═══════════════════╬═══════════════╬═══════════════════╬═══════════════╬═══════════════════╬═══════════════╣ 
║ Medium   ║ High   ║ Low    ║ Low   ║ High    ║ Medium  ║ Medium   ║ High   ║ Low    ║ Medium  ║ Medium   ║ Low   ║ High    ║ Medium  ║ Low    ║ High   ║ Medium   ║ Low   ║ 
╚═══════════════════╩═══════════════╩═══════════════════╩═══════════════╩═══════════════════╩═══════════════╩═══════════════════╩═══════════════╩═══════════════════╩═══════════════╩═══════════════════╩═══════════════╩═══════════════════╩═══════════════╩═══════════════════╩═══════════════╩═══════════════════╩═══════════════╝ 

所需的輸出

但我想unpivot的數據,以便如下圖所示,我已經看到了很多問題,對SO但沒有他們似乎符合我的要求。任何建議的指針都非常值得歡迎,謝謝。

╔════════╦════════════╦════════╗ 
║ Values ║ Historical ║ Recent ║ 
╠════════╬════════════╬════════╣ 
║ Value1 ║ High  ║ Medium ║ 
║ Value2 ║ Low  ║ Low ║ 
║ Value3 ║ Medium  ║ High ║ 
║ Value4 ║ High  ║ Medium ║ 
║ Value5 ║ High  ║ Medium ║ 
╚════════╩════════════╩════════╝ 
+0

你們是不是要執行連接,然後UNPIVOT,或執行上都歷史和最近的,然後加入一個UNPIVOT?你能提供一個不符合你的要求的先前問題的鏈接,並解釋它不適合的地方/原因嗎? – user3056839

+0

@ user3056839因爲我想要某個客戶端的當前值和第二個最新值,所以在將表加入到自身後,我獲得了當前輸出。現在我無法弄清楚數據是如何旋轉的,因此我認爲UNPIVOT查詢可以實現技巧,但是我還沒有真正在SQL Server中使用UNPIVOT語法,不熟悉語法。 –

+0

已經低估了這個問題的人,因爲它不清楚我要問什麼,我不知道我需要提供多少信息才能讓你明白我的要求?你是否想要我添加一個解決方案,以及將清楚,然後? –

回答

2

這將是做到這一點的一種方法:

;WITH up AS 
(
    SELECT * FROM @T 
    UNPIVOT 
    (
     val FOR n IN (Value1,value2,value3,value4,value5,value6,value7,value8,value9) 
    ) as pv 
) 
SELECT 
    A.ClientID, 
    A.Dated, 
    A.n as Values, 
    A.val as Recent, 
    B.val as History 
FROM 
    up as A 
    JOIN up as B 
     ON A.ClientID = B.ClientID 
     AND A.n = B.n 
WHERE B.Dated < A.Dated 
ORDER BY 
    A.Dated DESC, B.Dated DESC