Domanda

Test Data

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 ║
╚══════════╩═════════════════════════╩════════╩════════╩════════╩════════╩════════╩════════╩════════╩════════╩════════╝

My Query

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

As you can see I am pulling out The lastest Recordings for all the values and the recording recorded prior to that. Recent Values and Historical Values respectively. Which returns me Data back in the following format.

Current OUTPUT

╔═══════════════════╦═══════════════╦═══════════════════╦═══════════════╦═══════════════════╦═══════════════╦═══════════════════╦═══════════════╦═══════════════════╦═══════════════╦═══════════════════╦═══════════════╦═══════════════════╦═══════════════╦═══════════════════╦═══════════════╦═══════════════════╦═══════════════╗
║ 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           ║
╚═══════════════════╩═══════════════╩═══════════════════╩═══════════════╩═══════════════════╩═══════════════╩═══════════════════╩═══════════════╩═══════════════════╩═══════════════╩═══════════════════╩═══════════════╩═══════════════════╩═══════════════╩═══════════════════╩═══════════════╩═══════════════════╩═══════════════╝

Desired OUTPUT

But I would like to UNPIVOT the data so it is shown as Follows, I have seen a lot of question on SO but none of them seems to fit my requirement. Any pointer any advice is most welcome thank you.

╔════════╦════════════╦════════╗
║ Values ║ Historical ║ Recent ║
╠════════╬════════════╬════════╣
║ Value1 ║ High       ║ Medium ║
║ Value2 ║ Low        ║ Low    ║
║ Value3 ║ Medium     ║ High   ║
║ Value4 ║ High       ║ Medium ║
║ Value5 ║ High       ║ Medium ║
╚════════╩════════════╩════════╝
È stato utile?

Soluzione

This would be one way to do it:

;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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top