세로 데이터를 가로로 0 3 2,140

by 이광영 [MySQL] [2013.06.25 17:11:13]


Time                            ID     Value
----------------------------------------------------
2013/06/25 19:20:21      1        -2.5
2013/06/25 19:20:21      2        15.6
2013/06/25 19:20:21      3        27.4
2013/06/25 19:20:21      4        -5.8
2013/06/25 19:21:21      1        -3.7
2013/06/25 19:21:21      2        12.3
2013/06/25 19:21:21      3        24.5
2013/06/25 19:21:21      4        -6.2

이런식으로 데이터가 저장되어 있을 때 쿼리를 아래처럼 동일 시간 기준으로 가로로 나올 수 있도록 작성할 수 있을까요?

Time                              1        2        3        4
-----------------------------------------------------------------------
2013/06/25 19:20:21      -2.5    15.6    27.4   -5.8
2013/06/25 19:21:21      -3.7    12.3    24.5   -6.2
by 우리집아찌 [2013.06.25 17:15:59]
WITH T (dt,c1,c2) AS (
SELECT '2013/06/25 19:20:21',   '1',    -2.5  FROM DUAL UNION ALL
SELECT '2013/06/25 19:20:21',   '2',    15.6  FROM DUAL UNION ALL
SELECT '2013/06/25 19:20:21',   '3',    27.4  FROM DUAL UNION ALL
SELECT '2013/06/25 19:20:21',   '4',    -5.8  FROM DUAL UNION ALL
SELECT '2013/06/25 19:21:21',   '1',    -3.7  FROM DUAL UNION ALL
SELECT '2013/06/25 19:21:21',   '2',    12.3  FROM DUAL UNION ALL
SELECT '2013/06/25 19:21:21',   '3',    24.5  FROM DUAL UNION ALL
SELECT '2013/06/25 19:21:21',   '4',    -6.2  FROM DUAL 
)

SELECT 
    DT "TIME"
    ,MIN(DECODE(c1, 1 , c2 )) "1"
    ,MIN(DECODE(c1, 2 , c2 )) "2"
    ,MIN(DECODE(c1, 3 , c2 )) "3"
    ,MIN(DECODE(c1, 4 , c2 )) "4"
FROM T
GROUP BY DT
 

by 신이만든짝퉁 [2013.06.25 17:46:58]
mysql도 오라클과 유사하네요.

select time
     , min(if(id=1, value, null)) '1'
     , min(if(id=2, value, null)) '2'
     , min(if(id=3, value, null)) '3'
     , min(if(id=4, value, null)) '4'
  from (
        SELECT '2013/06/25 19:20:21' time,   '1' id , -2.5  value  UNION ALL
        SELECT '2013/06/25 19:20:21',   '2',    15.6  UNION ALL
        SELECT '2013/06/25 19:20:21',   '3',    27.4  UNION ALL
        SELECT '2013/06/25 19:20:21',   '4',    -5.8  UNION ALL
        SELECT '2013/06/25 19:21:21',   '1',    -3.7  UNION ALL
        SELECT '2013/06/25 19:21:21',   '2',    12.3  UNION ALL
        SELECT '2013/06/25 19:21:21',   '3',    24.5  UNION ALL
        SELECT '2013/06/25 19:21:21',   '4',    -6.2 
        ) t
 group by time

by 마농 [2013.06.25 17:51:47]
MySQL 에서는 IF 문도 되는군요.
DBMS 에 상관없이 돌아가도록 ANSI SQL 로 하는것이 좋을 듯
, MIN(CASE id WHEN 1 THEN value END) "1"
, MIN(CASE WHEN id = 1 THEN value END) "1"
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입