이게 될거같은데 자꾸 제자리 걸음 하고있으니 미치고 팔짝뛰겠내요 ㅠㅠ..
outer join 을 쓰라고 하는데...
조건 1. 2번테이블과 3번테이블의 소구분 코드는 같아야함
조건 2. 대구분 코드를 기준으로 일간 데이터를 추출,
1번째 TB_CD (코드 대구분, 대구분 코드 이름)
DTL_NM | DTL_CD |
로그인 | G01 |
1강의 수강 | G02 |
1강의 다운로드 | G03 |
1강좌 수강 | G04 |
2번째 TB_MSTR (코드 소구분, 대구분)
| |||
E104 | G09 | ||
X001 | G12 | ||
X999 | G09 | ||
E026 | G09 | ||
E036 | G09 |
3번째 TB_LOG (포인트 사용, 적립 로그, 코드 소구분)
YYYYMMDD | ITM_CB_PNT | ITM_CD |
20130227 | 20 | A001 |
20130228 | 20 | A001 |
20130123 | 20 | A001 |
20130124 | 20 | A001 |
20130102 | 20 | A001 |
20130103 | 20 | A001 |
20130104 | 20 | A001 |
20130107 | 20 | A001 |
20130108 | 20 | A001 |
D0 | D1 | D2 | D3 | ||
20일(일) | 21일(월) | 22일(화) | 23일(수) | ||
G01 | 로그인 | 0 | 0 | 100 | 0 |
G02 | 1강의 수강 | 0 | 300 | 0 | 0 |
G03 | 1강의 다운로드 | 900 | 0 | 0 | 0 |
G04 | 1강좌 수강 | 0 | 0 | 1560 | |
G05 | 1강좌 다운로드 | 0 | 20 | 0 | 0 |
대충 요런식으로 나와야해서..
SELECT
MAX(CASE WHEN YYYYMMDD='20131020' THEN SUM(AA.ITM_CB_CNT) ELSE '0' END) ,
MAX(CASE WHEN YYYYMMDD='20131021' THEN SUM(AA.ITM_CB_CNT) ELSE '0' END) ,
MAX(CASE WHEN YYYYMMDD='20131022' THEN SUM(AA.ITM_CB_CNT) ELSE '0' END)
FROM(
SELECT
YYYYMMDD, ITM_CB_CNT, ITM_GRP
FROM TB_MSTR A, TB_LOG B
WHERE A.ITM_CD = B.ITM_CD
) AA , TB_CD BB
WHERE AA.ITM_GRP = BB.DTL_CD
GROUP BY YYYYMMDD
위의 쿼리를 마지막으로 만든거같은데.. 안되내요..
outer 조인을 쓰면된다고 해서 (+)를 이쪽에도 붙여보고 저쪽에도 붙여봤는데.. 이것도 안되고..
일단 혹 몰라서 테이틀내용을 첨부했습니다..
Comment 5
-
군고구마
2013.10.31 10:25
-
군고구마
2013.10.31 10:26
out join 도 3가지가 있어서요. 어떠한 outer join으로 하라고 하셨는지도 궁금하네요.
-
추소
2013.10.31 11:31
이게 설명을 어찌 드려야하지..ㅠ
그러니까 2번 테이블하고 3번테이블을 소구분 코드가 같은 애들끼리 조인을 시켜서 대구분코드에 속하는 소구분 코드를 매치시킨뒤에
다시 1번 테이블과 조인시켜서 일간 데이터가 출력이 될수있게 만든다? 라고 설명을 드려야되나...
outer 조인은.. 그냥 outer조인을 써봐라 라고해서.. 핳.. 저도 잘 모르겠어요
-
군고구마
2013.10.31 14:18
SELECT *FROM(SELECT T_CD.DTL_CD,T_CD.DTL_NM,LOG_TOTAL.YYYYMMDD,LOG_TOTAL.ITM_CB_PNTFROM TB_CD AS T_CD WITH(NOLOCK)LEFT JOIN(SELECT MSRT.ITM_CD,MSRT.ITM_GRP,MAX(T_LOG.YYYYMMDD)AS YYYYMMDD,MAX(T_LOG.ITM_CB_PNT) AS ITM_CB_PNTFROM TB_MSTR AS MSRT WITH(NOLOCK)INNER JOIN(SELECT A.YYYYMMDD,B.ITM_CB_PNT,A.ITM_CDFROM TB_LOG AS A WITH(NOLOCK)INNER JOIN(SELECT YYYYMMDD,SUM(ITM_CB_PNT)AS ITM_CB_PNTFROM TB_LOG WITH(NOLOCK)GROUP BY YYYYMMDD)BON A.YYYYMMDD = B.YYYYMMDD)T_LOGON MSRT.ITM_CD = T_LOG.ITM_CDGROUP BY MSRT.ITM_CD,MSRT.ITM_GRP)LOG_TOTALON T_CD.DTL_CD = LOG_TOTAL.ITM_GRP)AS PPIVOT(SUM(ITM_CB_PNT) FOR YYYYMMDD IN([20130101],[20130102 ],[20130103]))AS PivORDER BY DTL_CD이렇게 해보세요 ^^그런대 이게 단점이 피봇으로 하기 때문에 일일이 날짜 부분을 추가해서 넣어줘야 합니다.저의 짧은 지식으로는 여기까지네요 ^^.. -
건우아빠
2013.10.31 15:22
TB_CD 있는 대분류를 다 나오게 해서 표를 만드신다는의미일때는
TB_CD 을 기준으로 left 아웃 조인을 하셔도 되구요.
TB_CD 을 log 자료에 맞게 union 으로 붙여서 처리하시면 동일한 효과를 볼수도 있습니다...
음...제가 부족한 지식이라 잘 이해가 안가서 그런대
이게 혹시 inner 조인이 아닌지요 ^^;
테스트 해보니 그런거 같아서요. inner이지만 값이 2번씩 즉, A에도 있고 B에도 있면 행이 2번 나오네요 ^^
create table Join_test1
(
ID int
,name varchar(20)
)
go
create table Join_test2
(
ID int
,name varchar(20)
)
insert into Join_test1 values(1,'주형권0')
insert into Join_test1 values(2,'주형권1')
insert into Join_test1 values(3,'주형권2')
insert into Join_test1 values(4,'주형권3')
insert into Join_test1 values(5,'주형권4')
insert into Join_test1 values(9,'주형권9')
insert into Join_test1 values(10,'주형권10')
insert into Join_test2 values(1,'주형권0')
insert into Join_test2 values(2,'주형권1')
insert into Join_test2 values(3,'주형권2')
insert into Join_test2 values(4,'주형권3')
insert into Join_test2 values(5,'주형권4')
insert into Join_test2 values(6,'주형권5')
insert into Join_test2 values(7,'주형권6')
insert into Join_test2 values(8,'주형권7')
select * from Join_test2
select * from Join_test1
select a.ID,b.name
from Join_test1 a,Join_test2 b
where a.ID = b.ID