쿼리 문의 드립니다. 0 13 1,234

by 도겸아빠 [SQL Query] [2013.06.26 15:47:55]


1    FLAG ROUTE              REV                         PAX
2    Y1 HNL-ICN 100 200
3    Y1 HNL-ICN 1 2
4    Y2 HNL-NRT 3 4


4번행 Y2가 존재하면 
HNL-NRT 104, 206
4번행의 Y2가 존재하지 않으면
HNL-ICN, 101, 202

쉬운거 같으면서도 잘 모르겠네요
감사합니다.^^
by 아발란체 [2013.06.26 16:09:16]

질문이 무지 쉬운 것 같으면서도 ... 너무 쉬워 아닌 것 같기도 하지만.
위 조회 결과 자체를 FLAG와 ROUTE 항목 2개로 그룹바이 합계내면 될 것 같은데요.
그럼 Y2야 없으면 101, 202 되고, 있음 같이 합산 되고요.


by 아발란체 [2013.06.26 16:12:27]
어 아니군요..

by 아발란체 [2013.06.26 16:14:41]
--아래 식으로 아예 flag와 doute를 신경 안쓰면 되지 않나요? 
--그럼 y2가 있으면 더하고 없으면 안더하고.
--꼭 flag 값이 y1과 y2를 본다면 조건식에 "where flag in('y1', 'y2')" 넣음 될 것 같고요.
WITH T AS (
  SELECT 'Y1' AS flag, 'HNL-ICN' AS route, 100 AS rev, 200 AS pax FROM DUAL
  UNION ALL SELECT 'Y1', 'HNL-ICN', 1, 2 FROM DUAL 
  --UNION ALL SELECT 'Y2', 'HNL-NRT', 3, 4 FROM DUAL 
)
SELECT
  SUM(rev) AS rev, SUM(pax) AS pax
FROM
  T

by 우리집아찌 [2013.06.26 16:24:57]

4번행이랑 44번행은 어떻게 보는건지요?

by 도겸아빠 [2013.06.26 16:26:20]
죄송합니다.
같은 4번행입니다.
칼럼들이 더 있으나 간단하게 위와 같이 줄였습니다...
감사합니다.

by 우리집아찌 [2013.06.26 16:34:06]
잘 모르긴하지만 FLAG 가 Y2면 현재 행까지 누적합 Y1면 전행까지 누적합인가요?

by 도겸아빠 [2013.06.26 16:37:08]
예~
전체 sum은 맞습니다.
그런데 Y2가 있느냐 없느냐에 따라 route값이 변경되는겁니다.

by 디케이 [2013.06.26 16:38:24]
REV, PAX는 아발란체님처럼 SUM()으로 구하시면 되고요
ROUTE는 아마도 flag가 가장큰값의 Route를 구하시는것 같은데..

MIN(route) KEEP (DENSE_RANK LAST ORDER BY flag) route

by 우리집아찌 [2013.06.26 16:41:38]
 
-- 꽁수좀 썼습니다.. ^^*
WITH T (  FLAG, ROUTE, REV, PAX) AS (
SELECT 'Y1' , 'HNL-ICN' , 100 , 200 FROM DUAL UNION ALL
SELECT 'Y1' , 'HNL-ICN' , 1 , 2 FROM DUAL UNION ALL
SELECT 'Y2' , 'HNL-ICN' , 3 , 4 FROM DUAL 
) 

SELECT 
   FLAG, ROUTE, REV, PAX 
   ,SUM(REV) OVER(ORDER BY ROWNUM ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) - DECODE(FLAG,'Y2',0,REV) REV_SUM 
   ,SUM(PAX) OVER(ORDER BY ROWNUM ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) - DECODE(FLAG,'Y2',0,PAX) PAX_SUM
   
FROM T



by 우리집아찌 [2013.06.26 16:42:42]
어째 잘못 이해한듯 ㅡㅡ;

by 마농 [2013.06.26 16:42:54]

sum 은 전혀 문제 될게 없을 듯 하구요.
route 를 출력하는 모호한 기준만 명확하게 집어주시면 될 것 같습니다.

flag 는 y1, y2 두가지 뿐인가요?
y2는 항상 1개인가요? 2개 이상일수도 있나요?
각 y1, y2 에 해당하는 route 명칭은 1개인가요? 여러개가 될수는 없나요?

위 나열된 것이 시간의 순서에 따른 것인가요? 무작위로 나열된건가요?
시간의 순서와 연관이 있어 마지막 입력값을 보여줘야 하는 것인가요?
아니면 시간의 순서와 무관하게 오로지 flag가 y2 인것이 우선인건가요?


by 아발란체 [2013.06.26 16:46:22]
WITH T AS (
 SELECT 'Y1' AS flag, 'HNL-ICN' AS route, 100 AS rev, 200 AS pax FROM DUAL
 UNION ALL SELECT 'Y1', 'HNL-ICN', 1, 2 FROM DUAL 
 --UNION ALL SELECT 'Y2', 'HNL-NRT', 3, 4 FROM DUAL 
)
SELECT
 NVL(MAX(DECODE(flag, 'Y2', route, NULL)), MAX(route)),
 SUM(rev) AS rev,
 SUM(pax) AS pax
FROM
 T
--이경우 마농님 말씀처럼 Y1, Y2가 아닌 또 다른 것이 있다면 ROUTE 결과가 엉뚱하게 나옵니다.
--또한 Y1이 ROUTE 값을 다르게 또 가지고 있다고 해도 엉뚱하게 결과가 나옵니다.
--이 엉뚱하게 나오는 것에 대해 문제가 있다면 여기에 대한 기준 값이 되는 단서가 더 필요합니다.

by 도겸아빠 [2013.06.26 17:14:31]
아~
엄청난 관심에 감사드립니다.
우리집아찌님과 아발란체님의 쿼리를 기준으로 연구해보겠습니다.
정말 감사합니다.
복받으실 겁니다....^^
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입