쿼리 질문입니다 0 11 1,333

by 하일리 쿼리 sql query [2020.01.06 13:57:54]


 

안녕하십니까.

쿼리 초보입니다. 제가 궁금한 것은 쿼리에서 계산식을 통해 원하는 값을 필드로 등록 할 수있는 것입니다.

자세한 사항은 데이터 테이블 정보는 아래와 같습니다.

1.데이터 테이블 

Date ID Value
2020.1.1 A 11
2020.1.1 B 12
2020.1.1 C 13
2020.1.1 D 14
2020.1.2 A 21
2020.1.2 C 23

2. Primary key

- Date, ID

3. 얻고 싶은 정보

- 각 날짜에 대한 특정 ID의 Value 값의 연산 (예: 아래 결과 테이블 참조)

4. 결과 테이블

Date A+B+C A+C (A*D)/12 B-12 C*11
2019 1/1 11+12+13 11+13 (11+14)/12 12-12 13*11
2019 1/2 21+0+23 21+23 (21*0)/12 0-12 23*11

 

혹시 다음과 같은 결과를 쿼리를 통해서 얻을 수 있나요?

가능하다면 어떤식으로 진행해야하는 지 힌트라도 주시면 감사합니다

by 냄나 [2020.01.06 14:17:40]
SELECT t.dt
     , t.A + t.B + t.C AS "A+B+C"
     , t.A + t.C AS "A+C"
     , (t.A * t.D) / 12 AS "(A*D)/12"
     , t.B - 12 AS "B-12"
     , t.C * 11 AS "C*11"
  FROM (
        SELECT t.dt
             , SUM(t.A) AS "A"
             , SUM(t.B) AS "B"
             , SUM(t.C) AS "C"
             , SUM(t.D) AS "D"
          FROM (
             
             WITH ttt AS(
                  SELECT '2020.1.1' AS dt, 'A' AS ID, 11 AS VALUE FROM DUAL UNION ALL
                  SELECT '2020.1.1' AS dt, 'B' AS ID, 12 AS VALUE FROM DUAL UNION ALL
                  SELECT '2020.1.1' AS dt, 'C' AS ID, 13 AS VALUE FROM DUAL UNION ALL
                  SELECT '2020.1.1' AS dt, 'D' AS ID, 14 AS VALUE FROM DUAL UNION ALL
                  SELECT '2020.1.2' AS dt, 'A' AS ID, 21 AS VALUE FROM DUAL UNION ALL
                  SELECT '2020.1.2' AS dt, 'B' AS ID, 23 AS VALUE FROM DUAL
                ) 
                SELECT t.dt
                     , CASE WHEN t.id = 'A' THEN t.value ELSE NULL END AS A
                     , CASE WHEN t.id = 'B' THEN t.value ELSE NULL END AS B
                     , CASE WHEN t.id = 'C' THEN t.value ELSE NULL END AS C
                     , CASE WHEN t.id = 'D' THEN t.value ELSE NULL END AS D     
                  FROM ttt t
                ) t
         GROUP BY t.dt
       ) t
 ORDER BY 1 ASC

노가다로 이렇게할려나여


by 하일리 [2020.01.06 14:35:40]

답변 감사합니다.

저도 노가다를 하려고 하였으나, 실제로는 결과 테이블에는

100이상의 컬럼과 더 복잡하고 많은 연산이 필요로 하여 사실상 힘들다고 생각합니다 ㅠㅠ

저는 그냥 원본 데이터만 불러와서 계산을 프로그램에서 하고 싶은데, 

위에서는 쿼리에서 계산을 다 마치고 값만 가져오라는 요구를 받아서 걱정입니다 ㅜㅜㅜ


by 우리집아찌 [2020.01.06 14:25:31]

by 쏘영 [2020.01.06 15:08:06]

결과테이블의 계산식은 고정이면, DECODE 쓰면 어떤가요? 

SELECT SUM(DECODE(ID, 'D', 0, VALUE)), SUM(DECODE(ID, 'B', 0, 'D', 0, VALUE)).... 이렇게...


by 하일리 [2020.01.06 15:14:58]

답변 감사합니다

제가 Decode를 몰라서 한번 찾아보겠습니다

감사합니다 ㅜㅜ


by 마농 [2020.01.06 15:19:48]
WITH t AS
(
SELECT '2020.01.01' dt, 'A' id, 11 v FROM dual
UNION ALL SELECT '2020.01.01', 'B', 12 FROM dual
UNION ALL SELECT '2020.01.01', 'C', 13 FROM dual
UNION ALL SELECT '2020.01.01', 'D', 14 FROM dual
UNION ALL SELECT '2020.01.02', 'A', 21 FROM dual
UNION ALL SELECT '2020.01.02', 'C', 23 FROM dual
)
SELECT dt
     , a, b, c, d
     , a+b+c              v1
     , a+c                v2
     , ROUND((a*d)/12, 2) v3
     , b-12               v4
     , c*11               v5
  FROM (SELECT dt
             , NVL(MIN(DECODE(id, 'A', v)), 0) a
             , NVL(MIN(DECODE(id, 'B', v)), 0) b
             , NVL(MIN(DECODE(id, 'C', v)), 0) c
             , NVL(MIN(DECODE(id, 'D', v)), 0) d
          FROM t
         GROUP BY dt
         ORDER BY dt
        ) a
;

 


by 하일리 [2020.01.06 15:28:20]

감사합니다

제가 아직 테스트해보지는 않았지만 어떤식으로 풀어나갈지 감이 잡힙니다 

WITH t AS
(
SELECT '2020.01.01' dt, 'A' id, 11 v FROM dual
UNION ALL SELECT '2020.01.01', 'B', 12 FROM dual
UNION ALL SELECT '2020.01.01', 'C', 13 FROM dual
UNION ALL SELECT '2020.01.01', 'D', 14 FROM dual
UNION ALL SELECT '2020.01.02', 'A', 21 FROM dual
UNION ALL SELECT '2020.01.02', 'C', 23 FROM dual
)

첫 도입부분을 어떤식을 다듬어야 할 지 고민해보겠습니다.

 


by 마농 [2020.01.06 15:36:02]

첫 도입부분은 없는 샘 치시면 됩니다. 뒤에 쿼리 작성 스타일만 보세요.


by 하일리 [2020.01.06 15:43:50]

딱 제가 원하는 쿼리인데 제가 db에 대한 설명이 없었네요 ㅜ

저는 지금 구글의 Bigquery를 이용하고 있습니다. 이 서비스에서는

DECODE 함수가 제공되지 않는 것으로 보입니다. 

어쩔수 없이 다른 방법을 찾아봐야겠네요 ㅜㅜ 

ORACLE에서는 충분히 가능한 쿼리인 것 같습니다

답변 감사합니다.

 


by 마농 [2020.01.06 16:01:25]

DECODE 대신 CASE 문을 이용해 보세요.
NVL 이 안되면 다른 널 대체 함수 찾아보세요. COALESCE
쿼리 사용법은 거의 비슷합니다. 함수 사용법이 다른 건 대체 함수를 찾아보세요.


by 하일리 [2020.01.06 16:07:50]

네 CASE 문이 대체 가능한 것 같아

테스트중입니다.

감사합니다 덕분에 어떤식으로 나아가야 할 지

감잡았습니다. ^^

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입