Преобразование нескольких строк в столбец (разворот)

Я пытаюсь преобразовать таблицу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 

СМАРТМЕТР

МЕТЕРНУМ ЧИТАТЬ ДАТУ1 READAMOUNT1 ЧИТАТЬДАТЕТМЕ2 READAMOUNT2 0001 20240501 01:00 100 20240501 02:00 120 0001 20240502 01:00 110 20240502 02:00 115

Т2

МЕТЕРНУМ ЧИТАТЬ ДАТУ READAMOUNT 0001 20240501 01:00 100 0001 20240501 02:00 120 0001 20240502 01:00 110 0001 20240502 02:00 115

SMARTMETER — это источник, а T2 — то, как я хочу представлять данные.

Garrett Jones 11.06.2024 17:44
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
1
51
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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

рабочий пример

МЕТЕРНУМ SMREADDATE SMREADAMOUNT 1 2024-05-01 01:00:00.000 100 1 2024-05-01 02:00:00.000 120 1 2024-05-02 01:00:00.000 110 1 2024-05-02 02:00:00.000 115
Ответ принят как подходящий

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;

Полученные результаты:

МЕТЕРНУМ ЧИТАТЬ ДАТУ READAMOUNT 1 2024-05-01 01:00:00.000 100 1 2024-05-01 02:00:00.000 120 1 2024-05-02 01:00:00.000 110 1 2024-05-02 02:00:00.000 115

Также очень неприятно, что READDATETME отсутствует I, чего бы это ни стоило.

Другие вопросы по теме