쿼리질문입니다. 0 2 963

by 힘내라김대리 [SQLServer] [2019.07.24 12:55:00]


안녕하세요. 궁금한것이 있어서 질문을 올립니다.

 

테이블 A 와 테이블 B에는 다음과 같이 테이블과 데이터가 구성되어 있습니다.

 

그리고 테이블 C와 D, E는 디멘젼 테이블로 구성되어있습니다.

 

테이블 A)

날짜 (ORDER_DATE) 회원명(NAME) 결제금액(PAY_AMOUNT)
2019-07-20 홍길동 10000
2019-07-20 어우동 2000
2019-07-20 임꺽정 1000
2019-07-21 홍길동 20000
2019-07-21 유재석 5000
2019-07-23 유재석 4000
2019-07-23 이효리 10000
2019-07-24 이효리 5000
2019-07-24 어우동 4000

 

테이블 B)

이름(NAME) 성별(GENDER) 연령대(AGE_GROUP)
홍길동 30
어우동 20
임꺽정 40
유재석 30
이효리 30

 

테이블 C)

성별

 

테이블 D)

연령대
10
20
30
40
50
60

 

테이블 E)

날짜
2019-07-20
2019-07-21
2019-07-22
2019-07-23
2019-07-24

이 5개의 테이블을 가지고 일별 성별 연령대별 일일 마감데이터를 출력하려고 합니다.

SELECT  A.ORDER_DATE 

          ,B.GENDER

          ,B.AGE_GROUP

          ,SUM(A.PAY_AMOUNT) AS PAY_AMOUNT

FROM  테이블 A 

JOIN   테이블 B ON A.NAME = B.NAME

GROUP BY A.ORDER_DATE, B.GENDER, B.AGE_GROUP

디멘젼 테이블인 테이블 c와 테이블 D, E를 제외하고 테이블A와 테이블B를 가지고 쿼리를 작성하면

결제를 하지 않은 날과 성별이 없거나, 연령층이 없는 경우는 출력이 안되는것이 맞지만

 

제가 원하는 결과물은 결제를 하지 않은 날도 출력이 되게끔 하는것입니다.

 

날짜와 성별, 연령층으로 LEFT JOIN을 각각 연결해서 조회했지만 원하는 결과가 나오지 않았습니다..

 

어떻게 아래와 같은 결과가 나오도록 쿼리를 작성해야할까요??

 

예) 

날짜(ORDER_DATE) 성별(GENDER) 연령대(AGE_GROUP) 결제금액(PAY_AMOUNT)
2019-07-20 10 0
2019-07-20 20 0
2019-07-20 30 10000
2019-07-20 40 1000
2019-07-20 50 0
2019-07-20 60 0
2019-07-20 10 0
2019-07-20 20 2000
2019-07-20 30 0
2019-07-20 40 0
2019-07-20 50 0
2019-07-20 60 0
... ... ... ..
2019-07-22 10 0
2019-07-22 20 0
2019-07-22 30 0
2019-07-22 40 0
2019-07-22 50 0
... ... ... ...
2019-07-22 50 0
2019-07-22 60 0

 

by 꼬랑지 [2019.07.24 17:31:01]

WITH A AS (
SELECT '2019-07-20' ORDER_DATE,    '홍길동' NAME,    10000 PAY_AMOUNT FROM DUAL UNION ALL
SELECT '2019-07-20' ORDER_DATE,    '어우동' NAME,    2000  PAY_AMOUNT FROM DUAL UNION ALL
SELECT '2019-07-20' ORDER_DATE,    '임꺽정' NAME,    1000  PAY_AMOUNT FROM DUAL UNION ALL
SELECT '2019-07-21' ORDER_DATE,    '홍길동' NAME,    20000 PAY_AMOUNT FROM DUAL UNION ALL
SELECT '2019-07-21' ORDER_DATE,    '유재석' NAME,    5000  PAY_AMOUNT FROM DUAL UNION ALL
SELECT '2019-07-23' ORDER_DATE,    '유재석' NAME,    4000  PAY_AMOUNT FROM DUAL UNION ALL
SELECT '2019-07-23' ORDER_DATE,    '이효리' NAME,    10000 PAY_AMOUNT FROM DUAL UNION ALL
SELECT '2019-07-24' ORDER_DATE,    '이효리' NAME,    5000  PAY_AMOUNT FROM DUAL UNION ALL
SELECT '2019-07-24' ORDER_DATE,    '어우동' NAME,    4000  PAY_AMOUNT FROM DUAL
), B AS (
SELECT '홍길동' NAME,    'M' GENDER,    '30' AGE_GROUP FROM DUAL UNION ALL
SELECT '어우동' NAME,    'W' GENDER,    '20' AGE_GROUP FROM DUAL UNION ALL
SELECT '임꺽정' NAME,    'M' GENDER,    '40' AGE_GROUP FROM DUAL UNION ALL
SELECT '유재석' NAME,    'M' GENDER,    '30' AGE_GROUP FROM DUAL UNION ALL
SELECT '이효리' NAME,    'W' GENDER,    '30' AGE_GROUP FROM DUAL
), C AS (
SELECT 'M' GENDER FROM DUAL UNION ALL
SELECT 'W' GENDER FROM DUAL
), D AS (
SELECT '10' AGE_GROUP FROM DUAL 
UNION ALL SELECT '20' AGE_GROUP FROM DUAL 
UNION ALL SELECT '30' AGE_GROUP FROM DUAL 
UNION ALL SELECT '40' AGE_GROUP FROM DUAL 
UNION ALL SELECT '50' AGE_GROUP FROM DUAL
UNION ALL SELECT '60' AGE_GROUP FROM DUAL 
)
SELECT
G.ORDER_DATE,G.GENDER,G.AGE_GROUP
,NVL(SUM(F.PAY_AMOUNT),0)
FROM (
SELECT
A.ORDER_DATE,A.NAME,A.PAY_AMOUNT,B.GENDER,B.AGE_GROUP
FROM A, B 
WHERE 1=1
AND A.NAME=B.NAME
) F
,(
SELECT ORDER_DATE,GENDER,AGE_GROUP
FROM C,D,(
    SELECT DISTINCT ORDER_DATE FROM A
    )
) G
WHERE 1=1
AND F.GENDER(+) = G.GENDER
AND F.AGE_GROUP(+) = G.AGE_GROUP
AND F.ORDER_DATE (+) = G.ORDER_DATE
GROUP BY G.ORDER_DATE,G.GENDER,G.AGE_GROUP
ORDER BY G.ORDER_DATE,G.GENDER,G.AGE_GROUP


by 힘내라김대리 [2019.07.25 13:27:54]

정말 감사합니다!!! 먼저 날짜와, 성별, 연령층을 먼저 해놓는것을 생각 못했네요

바쁘실텐데... 쿼리를 일일이 작성해주셔서 감사합니다.

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