Я пытаюсь преобразовать таблицу1 в выходные данные, показанные в таблице два. Есть ли способ использовать несколько разворотов, чтобы добиться этого без искажения данных. Не знаю, чего мне не хватает, но я получаю 4 записи для каждого readdatetme.
Я также пробовал группировать, но безрезультатно.
SELECT METERNUM
,SMREADDATE
,SMREADAMOUNT
FROM SMARTMETER A
UNPIVOT
(
SMREADDATE
FOR READDATE IN (READDATETME1,READDATETME2)
) B
UNPIVOT
(
SMREADAMOUNT
FOR READAMOUNT IN (READAMOUNT1,READAMOUNT2)
) C
СМАРТМЕТР
Т2


Я разделил его на два запроса unpivot, которые поместил во временные таблицы. Объединили их по номеру строки. Должен быть лучший способ.
SELECT * INTO #TEMPB
FROM
(
SELECT METERNUM,SMREADDATE, Row_Number() OVER (ORDER BY METERNUM) as rn
FROM SMARTMETER A
UNPIVOT
(
SMREADDATE
FOR READDATE IN (READDATETME1,READDATETME2)
) B
) x
SELECT * INTO #TEMPC
FROM
(
SELECT METERNUM, SMREADAMOUNT, Row_Number() OVER (ORDER BY METERNUM) as rn
FROM SMARTMETER A
UNPIVOT
(
SMREADAMOUNT
FOR READAMOUNT IN (READAMOUNT1,READAMOUNT2)
) C
) y
SELECT d.METERNUM, d.SMREADDATE, a.SMREADAMOUNT
FROM #TEMPB d
INNER JOIN #TEMPC a on d.METERNUM=a.METERNUM and d.rn=a.rn
CROSS APPLY можно использовать как импровизированный мульти-UNPIVOT:
SELECT s.METERNUM, x.READDATETME, x.READAMOUNT
FROM SMARTMETER AS s
CROSS APPLY
(
VALUES(READDATETME1, READAMOUNT1),
(READDATETME2, READAMOUNT2)
) AS x(READDATETME, READAMOUNT)
ORDER BY s.METERNUM, x.READDATETME;
Полученные результаты:
Также очень неприятно, что READDATETME отсутствует I, чего бы это ни стоило.
SMARTMETER — это источник, а T2 — то, как я хочу представлять данные.