by tosswin [SQL Query] mariadb 행->열 [2023.09.27 14:54:37]
table : tbl_test 에 다음과 같은 형태로 데이터가 있습니다.
| rundatetime | idxNo | accu |
| 2023-09-25 00:00:00 | 1 | 10 |
| 2023-09-25 00:00:00 | 2 | 20 |
| 2023-09-25 00:00:00 | 3 | 30 |
| 2023-09-25 00:00:00 | 4 | 40 |
| 2023-09-25 00:00:00 | 5 | 50 |
| 2023-09-25 00:00:00 | 6 | 60 |
| 2023-09-25 00:00:00 | 7 | 70 |
| 2023-09-25 00:00:00 | 8 | 80 |
| 2023-09-25 00:00:00 | 9 | 90 |
| 2023-09-25 00:00:00 | 10 | 100 |
| 2023-09-25 00:10:00 | 1 | 24.6 |
| 2023-09-25 00:10:00 | 2 | 27.9 |
| 2023-09-25 00:10:00 | 3 | 31.2 |
| 2023-09-25 00:10:00 | 4 | 53.7 |
| 2023-09-25 00:10:00 | 5 | 55.4 |
| 2023-09-25 00:10:00 | 6 | 71.7 |
| 2023-09-25 00:10:00 | 7 | 75.9 |
| 2023-09-25 00:10:00 | 8 | 86.2 |
| 2023-09-25 00:10:00 | 9 | 104.4 |
| 2023-09-25 00:10:00 | 10 | 107.9 |
| 2023-09-25 00:20:00 | 1 | 25.6 |
| 2023-09-25 00:20:00 | 2 | 42.5 |
| 2023-09-25 00:20:00 | 3 | 33.8 |
| 2023-09-25 00:20:00 | 4 | 66.6 |
| 2023-09-25 00:20:00 | 5 | 64.1 |
| 2023-09-25 00:20:00 | 6 | 77.5 |
| 2023-09-25 00:20:00 | 7 | 89.4 |
| 2023-09-25 00:20:00 | 8 | 88.1 |
| 2023-09-25 00:20:00 | 9 | 106.4 |
| 2023-09-25 00:20:00 | 10 | 112.8 |
| 2023-09-25 00:30:00 | 1 | 39.5 |
| 2023-09-25 00:30:00 | 2 | 54.3 |
| 2023-09-25 00:30:00 | 3 | 42.7 |
| 2023-09-25 00:30:00 | 4 | 74.4 |
| 2023-09-25 00:30:00 | 5 | 74.6 |
| 2023-09-25 00:30:00 | 6 | 79.2 |
| 2023-09-25 00:30:00 | 7 | 91 |
| 2023-09-25 00:30:00 | 8 | 98.2 |
| 2023-09-25 00:30:00 | 9 | 107.7 |
| 2023-09-25 00:30:00 | 10 | 124.1 |
| 2023-09-25 00:40:00 | 1 | 41.5 |
| 2023-09-25 00:40:00 | 2 | 67.4 |
| 2023-09-25 00:40:00 | 3 | 47.8 |
| 2023-09-25 00:40:00 | 4 | 74.7 |
| 2023-09-25 00:40:00 | 5 | 82.1 |
| 2023-09-25 00:40:00 | 6 | 87.6 |
| 2023-09-25 00:40:00 | 7 | 96.3 |
| 2023-09-25 00:40:00 | 8 | 102.3 |
| 2023-09-25 00:40:00 | 9 | 119.4 |
| 2023-09-25 00:40:00 | 10 | 127.5 |
| 2023-09-25 00:50:00 | 1 | 55.1 |
| 2023-09-25 00:50:00 | 2 | 80.3 |
| 2023-09-25 00:50:00 | 3 | 53.5 |
| 2023-09-25 00:50:00 | 4 | 81.5 |
| 2023-09-25 00:50:00 | 5 | 92.9 |
| 2023-09-25 00:50:00 | 6 | 98.9 |
| 2023-09-25 00:50:00 | 7 | 107.6 |
| 2023-09-25 00:50:00 | 8 | 108.1 |
| 2023-09-25 00:50:00 | 9 | 128.8 |
| 2023-09-25 00:50:00 | 10 | 139.6 |
| 2023-09-25 01:00:00 | 1 | 56.1 |
| 2023-09-25 01:00:00 | 2 | 87.3 |
| 2023-09-25 01:00:00 | 3 | 58.3 |
| 2023-09-25 01:00:00 | 4 | 92.8 |
| 2023-09-25 01:00:00 | 5 | 94.2 |
| 2023-09-25 01:00:00 | 6 | 113.7 |
| 2023-09-25 01:00:00 | 7 | 114.2 |
| 2023-09-25 01:00:00 | 8 | 112 |
| 2023-09-25 01:00:00 | 9 | 131.2 |
| 2023-09-25 01:00:00 | 10 | 145 |
| 2023-09-25 01:10:00 | 1 | 65.1 |
| 2023-09-25 01:10:00 | 2 | 96.4 |
| 2023-09-25 01:10:00 | 3 | 70.5 |
| 2023-09-25 01:10:00 | 4 | 101.2 |
| 2023-09-25 01:10:00 | 5 | 108.7 |
| 2023-09-25 01:10:00 | 6 | 121.8 |
| 2023-09-25 01:10:00 | 7 | 127 |
| 2023-09-25 01:10:00 | 8 | 122.8 |
| 2023-09-25 01:10:00 | 9 | 135.6 |
| 2023-09-25 01:10:00 | 10 | 159 |
| 2023-09-25 01:20:00 | 1 | 70.1 |
| 2023-09-25 01:20:00 | 2 | 97.8 |
| 2023-09-25 01:20:00 | 3 | 77.1 |
| 2023-09-25 01:20:00 | 4 | 112.8 |
| 2023-09-25 01:20:00 | 5 | 121.8 |
| 2023-09-25 01:20:00 | 6 | 134.6 |
| 2023-09-25 01:20:00 | 7 | 132 |
| 2023-09-25 01:20:00 | 8 | 128.4 |
| 2023-09-25 01:20:00 | 9 | 150.4 |
| 2023-09-25 01:20:00 | 10 | 173.5 |
| 2023-09-25 01:30:00 | 1 | 80.7 |
| 2023-09-25 01:30:00 | 2 | 97.9 |
| 2023-09-25 01:30:00 | 3 | 90.9 |
| 2023-09-25 01:30:00 | 4 | 120.9 |
| 2023-09-25 01:30:00 | 5 | 125 |
| 2023-09-25 01:30:00 | 6 | 137.2 |
| 2023-09-25 01:30:00 | 7 | 140.5 |
| 2023-09-25 01:30:00 | 8 | 134.3 |
| 2023-09-25 01:30:00 | 9 | 157.8 |
| 2023-09-25 01:30:00 | 10 | 174 |
| 2023-09-25 01:40:00 | 1 | 92.4 |
| 2023-09-25 01:40:00 | 2 | 103.1 |
| 2023-09-25 01:40:00 | 3 | 101.9 |
| 2023-09-25 01:40:00 | 4 | 125.3 |
| 2023-09-25 01:40:00 | 5 | 125.5 |
| 2023-09-25 01:40:00 | 6 | 145.1 |
| 2023-09-25 01:40:00 | 7 | 148.1 |
| 2023-09-25 01:40:00 | 8 | 143.8 |
| 2023-09-25 01:40:00 | 9 | 159.9 |
| 2023-09-25 01:40:00 | 10 | 179.8 |
| 2023-09-25 01:50:00 | 1 | 94.9 |
| 2023-09-25 01:50:00 | 2 | 112.6 |
| 2023-09-25 01:50:00 | 3 | 109 |
| 2023-09-25 01:50:00 | 4 | 136.1 |
| 2023-09-25 01:50:00 | 5 | 133.8 |
| 2023-09-25 01:50:00 | 6 | 149.4 |
| 2023-09-25 01:50:00 | 7 | 161.8 |
| 2023-09-25 01:50:00 | 8 | 157 |
| 2023-09-25 01:50:00 | 9 | 161.2 |
| 2023-09-25 01:50:00 | 10 | 179.9 |
| 2023-09-25 02:00:00 | 1 | 103.1 |
| 2023-09-25 02:00:00 | 2 | 119.9 |
| 2023-09-25 02:00:00 | 3 | 119.3 |
| 2023-09-25 02:00:00 | 4 | 137.8 |
| 2023-09-25 02:00:00 | 5 | 134.7 |
| 2023-09-25 02:00:00 | 6 | 156.2 |
| 2023-09-25 02:00:00 | 7 | 174.4 |
| 2023-09-25 02:00:00 | 8 | 171.3 |
| 2023-09-25 02:00:00 | 9 | 168.6 |
| 2023-09-25 02:00:00 | 10 | 182 |
위의 데이터를 다음과 같이 변경하려고 합니다.
| rundatetime | accu_01 | accu_02 | accu_03 | accu_04 | accu_05 | accu_06 | accu_07 | accu_08 | accu_09 | accu_10 |
아래와 같이 쿼리문을 작성하였습니다.
시간별 데이터 차이를 각각에 대해 구하려고 합니다.
select
max(rundatetime) as msdatetime,
(case when idxNo = '1'
then (accu - lead(accu, 1) over (order by rundatetime desc)) end) as accu_01,
(case when idxNo = '2'
then (accu - lead(accu, 1) over (order by rundatetime desc)) end) as accu_02,
(case when idxNo = '3'
then (accu - lead(accu, 1) over (order by rundatetime desc)) end) as accu_03,
(case when idxNo = '4'
then (accu - lead(accu, 1) over (order by rundatetime desc)) end) as accu_04,
(case when idxNo = '5'
then (accu - lead(accu, 1) over (order by rundatetime desc)) end) as accu_05,
(case when idxNo = '6'
then (accu - lead(accu, 1) over (order by rundatetime desc)) end) as accu_06,
(case when idxNo = '7'
then (accu - lead(accu, 1) over (order by rundatetime desc)) end) as accu_07,
(case when idxNo = '8'
then (accu - lead(accu, 1) over (order by rundatetime desc)) end) as accu_08,
(case when idxNo = '9'
then (accu - lead(accu, 1) over (order by rundatetime desc)) end) as accu_09,
(case when idxNo = '10'
then (accu - lead(accu, 1) over (order by rundatetime desc)) end) as accu_10
from tlb_test tt
group by rundatetime
그런데, 위와 같이 하면
| rundatetime | accu_01 | accu_02 | accu_03 | accu_04 | accu_05 | accu_06 | accu_07 | accu_08 | accu_09 | accu_10 |
| 00:00.0 | [null] | [null] | [null] | [null] | [null] | [null] | [null] | [null] | [null] | [null] |
| 10:00.0 | 14.6 | [null] | [null] | [null] | [null] | [null] | [null] | [null] | [null] | [null] |
| 20:00.0 | 1 | [null] | [null] | [null] | [null] | [null] | [null] | [null] | [null] | [null] |
| 30:00.0 | 13.9 | [null] | [null] | [null] | [null] | [null] | [null] | [null] | [null] | [null] |
| 40:00.0 | 2 | [null] | [null] | [null] | [null] | [null] | [null] | [null] | [null] | [null] |
| 50:00.0 | 13.6 | [null] | [null] | [null] | [null] | [null] | [null] | [null] | [null] | [null] |
| 00:00.0 | 1 | [null] | [null] | [null] | [null] | [null] | [null] | [null] | [null] | [null] |
| 10:00.0 | 9 | [null] | [null] | [null] | [null] | [null] | [null] | [null] | [null] | [null] |
| 20:00.0 | 5 | [null] | [null] | [null] | [null] | [null] | [null] | [null] | [null] | [null] |
| 30:00.0 | 10.6 | [null] | [null] | [null] | [null] | [null] | [null] | [null] | [null] | [null] |
| 40:00.0 | 11.7 | [null] | [null] | [null] | [null] | [null] | [null] | [null] | [null] | [null] |
| 50:00.0 | 2.5 | [null] | [null] | [null] | [null] | [null] | [null] | [null] | [null] | [null] |
| 00:00.0 | 8.2 | [null] | [null] | [null] | [null] | [null] | [null] | [null] | [null] | [null] |
accu_01 열만 제외하고 모두 null 입니다.
제가 무엇을 잘못하고 있을까요?
항상 잘 가르쳐 주셔서 감사합니다.
즐거운 한가위 보내세요.
WITH tbl_test AS
(
SELECT '2023-09-25 00:00:00' rundatetime, 1 idxNo, 10 accu
UNION ALL SELECT '2023-09-25 00:00:00', 2, 20
UNION ALL SELECT '2023-09-25 00:00:00', 3, 30
UNION ALL SELECT '2023-09-25 00:00:00', 4, 40
UNION ALL SELECT '2023-09-25 00:00:00', 5, 50
UNION ALL SELECT '2023-09-25 00:00:00', 6, 60
UNION ALL SELECT '2023-09-25 00:00:00', 7, 70
UNION ALL SELECT '2023-09-25 00:00:00', 8, 80
UNION ALL SELECT '2023-09-25 00:00:00', 9, 90
UNION ALL SELECT '2023-09-25 00:00:00', 10, 100
UNION ALL SELECT '2023-09-25 00:10:00', 1, 24.6
UNION ALL SELECT '2023-09-25 00:10:00', 2, 27.9
UNION ALL SELECT '2023-09-25 00:10:00', 3, 31.2
UNION ALL SELECT '2023-09-25 00:10:00', 4, 53.7
UNION ALL SELECT '2023-09-25 00:10:00', 5, 55.4
UNION ALL SELECT '2023-09-25 00:10:00', 6, 71.7
UNION ALL SELECT '2023-09-25 00:10:00', 7, 75.9
UNION ALL SELECT '2023-09-25 00:10:00', 8, 86.2
UNION ALL SELECT '2023-09-25 00:10:00', 9, 104.4
UNION ALL SELECT '2023-09-25 00:10:00', 10, 107.9
UNION ALL SELECT '2023-09-25 00:20:00', 1, 25.6
UNION ALL SELECT '2023-09-25 00:20:00', 2, 42.5
UNION ALL SELECT '2023-09-25 00:20:00', 3, 33.8
UNION ALL SELECT '2023-09-25 00:20:00', 4, 66.6
UNION ALL SELECT '2023-09-25 00:20:00', 5, 64.1
UNION ALL SELECT '2023-09-25 00:20:00', 6, 77.5
UNION ALL SELECT '2023-09-25 00:20:00', 7, 89.4
UNION ALL SELECT '2023-09-25 00:20:00', 8, 88.1
UNION ALL SELECT '2023-09-25 00:20:00', 9, 106.4
UNION ALL SELECT '2023-09-25 00:20:00', 10, 112.8
UNION ALL SELECT '2023-09-25 00:30:00', 1, 39.5
UNION ALL SELECT '2023-09-25 00:30:00', 2, 54.3
UNION ALL SELECT '2023-09-25 00:30:00', 3, 42.7
UNION ALL SELECT '2023-09-25 00:30:00', 4, 74.4
UNION ALL SELECT '2023-09-25 00:30:00', 5, 74.6
UNION ALL SELECT '2023-09-25 00:30:00', 6, 79.2
UNION ALL SELECT '2023-09-25 00:30:00', 7, 91
UNION ALL SELECT '2023-09-25 00:30:00', 8, 98.2
UNION ALL SELECT '2023-09-25 00:30:00', 9, 107.7
UNION ALL SELECT '2023-09-25 00:30:00', 10, 124.1
UNION ALL SELECT '2023-09-25 00:40:00', 1, 41.5
UNION ALL SELECT '2023-09-25 00:40:00', 2, 67.4
UNION ALL SELECT '2023-09-25 00:40:00', 3, 47.8
UNION ALL SELECT '2023-09-25 00:40:00', 4, 74.7
UNION ALL SELECT '2023-09-25 00:40:00', 5, 82.1
UNION ALL SELECT '2023-09-25 00:40:00', 6, 87.6
UNION ALL SELECT '2023-09-25 00:40:00', 7, 96.3
UNION ALL SELECT '2023-09-25 00:40:00', 8, 102.3
UNION ALL SELECT '2023-09-25 00:40:00', 9, 119.4
UNION ALL SELECT '2023-09-25 00:40:00', 10, 127.5
UNION ALL SELECT '2023-09-25 00:50:00', 1, 55.1
UNION ALL SELECT '2023-09-25 00:50:00', 2, 80.3
UNION ALL SELECT '2023-09-25 00:50:00', 3, 53.5
UNION ALL SELECT '2023-09-25 00:50:00', 4, 81.5
UNION ALL SELECT '2023-09-25 00:50:00', 5, 92.9
UNION ALL SELECT '2023-09-25 00:50:00', 6, 98.9
UNION ALL SELECT '2023-09-25 00:50:00', 7, 107.6
UNION ALL SELECT '2023-09-25 00:50:00', 8, 108.1
UNION ALL SELECT '2023-09-25 00:50:00', 9, 128.8
UNION ALL SELECT '2023-09-25 00:50:00', 10, 139.6
UNION ALL SELECT '2023-09-25 01:00:00', 1, 56.1
UNION ALL SELECT '2023-09-25 01:00:00', 2, 87.3
UNION ALL SELECT '2023-09-25 01:00:00', 3, 58.3
UNION ALL SELECT '2023-09-25 01:00:00', 4, 92.8
UNION ALL SELECT '2023-09-25 01:00:00', 5, 94.2
UNION ALL SELECT '2023-09-25 01:00:00', 6, 113.7
UNION ALL SELECT '2023-09-25 01:00:00', 7, 114.2
UNION ALL SELECT '2023-09-25 01:00:00', 8, 112
UNION ALL SELECT '2023-09-25 01:00:00', 9, 131.2
UNION ALL SELECT '2023-09-25 01:00:00', 10, 145
UNION ALL SELECT '2023-09-25 01:10:00', 1, 65.1
UNION ALL SELECT '2023-09-25 01:10:00', 2, 96.4
UNION ALL SELECT '2023-09-25 01:10:00', 3, 70.5
UNION ALL SELECT '2023-09-25 01:10:00', 4, 101.2
UNION ALL SELECT '2023-09-25 01:10:00', 5, 108.7
UNION ALL SELECT '2023-09-25 01:10:00', 6, 121.8
UNION ALL SELECT '2023-09-25 01:10:00', 7, 127
UNION ALL SELECT '2023-09-25 01:10:00', 8, 122.8
UNION ALL SELECT '2023-09-25 01:10:00', 9, 135.6
UNION ALL SELECT '2023-09-25 01:10:00', 10, 159
UNION ALL SELECT '2023-09-25 01:20:00', 1, 70.1
UNION ALL SELECT '2023-09-25 01:20:00', 2, 97.8
UNION ALL SELECT '2023-09-25 01:20:00', 3, 77.1
UNION ALL SELECT '2023-09-25 01:20:00', 4, 112.8
UNION ALL SELECT '2023-09-25 01:20:00', 5, 121.8
UNION ALL SELECT '2023-09-25 01:20:00', 6, 134.6
UNION ALL SELECT '2023-09-25 01:20:00', 7, 132
UNION ALL SELECT '2023-09-25 01:20:00', 8, 128.4
UNION ALL SELECT '2023-09-25 01:20:00', 9, 150.4
UNION ALL SELECT '2023-09-25 01:20:00', 10, 173.5
UNION ALL SELECT '2023-09-25 01:30:00', 1, 80.7
UNION ALL SELECT '2023-09-25 01:30:00', 2, 97.9
UNION ALL SELECT '2023-09-25 01:30:00', 3, 90.9
UNION ALL SELECT '2023-09-25 01:30:00', 4, 120.9
UNION ALL SELECT '2023-09-25 01:30:00', 5, 125
UNION ALL SELECT '2023-09-25 01:30:00', 6, 137.2
UNION ALL SELECT '2023-09-25 01:30:00', 7, 140.5
UNION ALL SELECT '2023-09-25 01:30:00', 8, 134.3
UNION ALL SELECT '2023-09-25 01:30:00', 9, 157.8
UNION ALL SELECT '2023-09-25 01:30:00', 10, 174
UNION ALL SELECT '2023-09-25 01:40:00', 1, 92.4
UNION ALL SELECT '2023-09-25 01:40:00', 2, 103.1
UNION ALL SELECT '2023-09-25 01:40:00', 3, 101.9
UNION ALL SELECT '2023-09-25 01:40:00', 4, 125.3
UNION ALL SELECT '2023-09-25 01:40:00', 5, 125.5
UNION ALL SELECT '2023-09-25 01:40:00', 6, 145.1
UNION ALL SELECT '2023-09-25 01:40:00', 7, 148.1
UNION ALL SELECT '2023-09-25 01:40:00', 8, 143.8
UNION ALL SELECT '2023-09-25 01:40:00', 9, 159.9
UNION ALL SELECT '2023-09-25 01:40:00', 10, 179.8
UNION ALL SELECT '2023-09-25 01:50:00', 1, 94.9
UNION ALL SELECT '2023-09-25 01:50:00', 2, 112.6
UNION ALL SELECT '2023-09-25 01:50:00', 3, 109
UNION ALL SELECT '2023-09-25 01:50:00', 4, 136.1
UNION ALL SELECT '2023-09-25 01:50:00', 5, 133.8
UNION ALL SELECT '2023-09-25 01:50:00', 6, 149.4
UNION ALL SELECT '2023-09-25 01:50:00', 7, 161.8
UNION ALL SELECT '2023-09-25 01:50:00', 8, 157
UNION ALL SELECT '2023-09-25 01:50:00', 9, 161.2
UNION ALL SELECT '2023-09-25 01:50:00', 10, 179.9
UNION ALL SELECT '2023-09-25 02:00:00', 1, 103.1
UNION ALL SELECT '2023-09-25 02:00:00', 2, 119.9
UNION ALL SELECT '2023-09-25 02:00:00', 3, 119.3
UNION ALL SELECT '2023-09-25 02:00:00', 4, 137.8
UNION ALL SELECT '2023-09-25 02:00:00', 5, 134.7
UNION ALL SELECT '2023-09-25 02:00:00', 6, 156.2
UNION ALL SELECT '2023-09-25 02:00:00', 7, 174.4
UNION ALL SELECT '2023-09-25 02:00:00', 8, 171.3
UNION ALL SELECT '2023-09-25 02:00:00', 9, 168.6
UNION ALL SELECT '2023-09-25 02:00:00', 10, 182
)
SELECT rundatetime
, MIN(CASE idxNo WHEN 1 THEN x END) accu_01
, MIN(CASE idxNo WHEN 2 THEN x END) accu_02
, MIN(CASE idxNo WHEN 3 THEN x END) accu_03
, MIN(CASE idxNo WHEN 4 THEN x END) accu_04
, MIN(CASE idxNo WHEN 5 THEN x END) accu_05
, MIN(CASE idxNo WHEN 6 THEN x END) accu_06
, MIN(CASE idxNo WHEN 7 THEN x END) accu_07
, MIN(CASE idxNo WHEN 8 THEN x END) accu_08
, MIN(CASE idxNo WHEN 9 THEN x END) accu_09
, MIN(CASE idxNo WHEN 10 THEN x END) accu_10
FROM (SELECT rundatetime, idxNo, accu
, accu - LAG(accu) OVER(PARTITION BY idxNo ORDER BY rundatetime) x
FROM tbl_test
) a
GROUP BY rundatetime
;
제가 완전히 잘못 알고 작성을 한 것이네요..
더 편한 방법을 가르쳐 주셔서 감사합니다.
필요한 부분에 잘 적용하였습니다.