3일동안 고민해도 도저히 답을 모르겟습니다 도와주세요 ㅠㅠ 1 4 1,114

by 밤에쩌는오빠 [SQL Query] [2011.12.20 17:20:00]


sql.jpg (83,509Bytes)


안녕하세요 sql 초보입니다...

3일 고민해도 답이 안나와 글을 올립니다...ㅠㅠ 아는분 좀 도와주세요...

[스크린샷 첨부]

A테이블에   B테이블에 있는 자료수를 카운트 할려고 하거든요..

문제는 B테이블에서  한 ROW에 자료가 1개든 4개든 카운트 1로 하고싶은데요...<--이게 문제 ㅠㅠ

A테이블에 자료명 / 자료가있는 컴퓨터수 를 표시하고 싶습니다..

도와주세요 ㅠ
by 마농 [2011.12.20 17:58:21]
WITH a AS
(
SELECT LEVEL nm
FROM dual
CONNECT BY LEVEL <= 10
)
, b AS
(
SELECT '가' com, 1 h1, 4 h2, 5 h3, 6 h4 FROM dual
UNION ALL SELECT '나', 3, 1, 1, 2 FROM dual
UNION ALL SELECT '다', 2, null, null, 2 FROM dual
UNION ALL SELECT '라', null, 2, null, null FROM dual
UNION ALL SELECT '마', 5, null, 2, null FROM dual
UNION ALL SELECT '바', null, 1, null, 2 FROM dual
UNION ALL SELECT '사', null, null, 3, null FROM dual
UNION ALL SELECT '아', null, 4, null, null FROM dual
UNION ALL SELECT '자', 5, null, 1, null FROM dual
UNION ALL SELECT '차', null, 6, null, 7 FROM dual
)
SELECT a.nm
, COUNT(b.com) cnt
FROM a
LEFT OUTER JOIN b
ON a.nm IN (b.h1, h2, h3, h4)
GROUP BY a.nm
ORDER BY a.nm
;

by 밤에쩌는오빠 [2011.12.20 18:34:01]
마농님 감사합니다...이렇게 하는거군요...좋은거 배워 갑니다 ^^

by 이재현 [2011.12.20 18:41:03]
WITH TB_A AS (
SELECT 1 NAME FROM DUAL
UNION ALL SELECT 2 NAME FROM DUAL
UNION ALL SELECT 2 NAME FROM DUAL
UNION ALL SELECT 3 NAME FROM DUAL
UNION ALL SELECT 4 NAME FROM DUAL
UNION ALL SELECT 5 NAME FROM DUAL
UNION ALL SELECT 6 NAME FROM DUAL
UNION ALL SELECT 7 NAME FROM DUAL
UNION ALL SELECT 8 NAME FROM DUAL
UNION ALL SELECT 9 NAME FROM DUAL
UNION ALL SELECT 10 NAME FROM DUAL
), TB_B AS(
SELECT '가' COM, 1 NAME1, 4 NAME2, 5 NAME3, 6 NAME4 FROM DUAL
UNION ALL SELECT '나' COM, 3 , 1 , 1 , 2 FROM DUAL
UNION ALL SELECT '다' COM, 2 , NULL , NULL , 2 FROM DUAL
UNION ALL SELECT '라' COM, NULL , 2 , NULL , NULL FROM DUAL
UNION ALL SELECT '마' COM, 5 , NULL , 2 , NULL FROM DUAL
UNION ALL SELECT '바' COM, NULL , 1 , NULL , 2 FROM DUAL
UNION ALL SELECT '사' COM, NULL , NULL , 3 , NULL FROM DUAL
UNION ALL SELECT '아' COM, NULL , 4 , NULL , NULL FROM DUAL
UNION ALL SELECT '자' COM, 5 , NULL , 1 , NULL FROM DUAL
UNION ALL SELECT '차' COM, NULL , 6 , NULL , 7 FROM DUAL
)
SELECT LV, NVL( COM, 0 ) AS COM
FROM (
SELECT /*+ LEADING( A ) FULL( A ) USE_NL( A B ) PUSH_PRED( B ) */ B.NAME, COUNT( DISTINCT B.COM ) COM
FROM TB_A A
, (SELECT NAME1 NAME, COM FROM TB_B
UNION ALL
SELECT NAME2, COM FROM TB_B
UNION ALL
SELECT NAME3, COM FROM TB_B
UNION ALL
SELECT NAME4, COM FROM TB_B
) B
WHERE A.NAME = B.NAME
GROUP BY B.NAME
) A
, (SELECT LEVEL LV FROM DUAL CONNECT BY LEVEL <= 10 ) B
WHERE A.NAME(+) = B.LV
ORDER BY LV

by 이재현 [2011.12.20 18:44:02]
WITH TB_A AS (
SELECT 1 NAME FROM DUAL
UNION ALL SELECT 2 NAME FROM DUAL
UNION ALL SELECT 2 NAME FROM DUAL
UNION ALL SELECT 3 NAME FROM DUAL
UNION ALL SELECT 4 NAME FROM DUAL
UNION ALL SELECT 5 NAME FROM DUAL
UNION ALL SELECT 6 NAME FROM DUAL
UNION ALL SELECT 7 NAME FROM DUAL
UNION ALL SELECT 8 NAME FROM DUAL
UNION ALL SELECT 9 NAME FROM DUAL
UNION ALL SELECT 10 NAME FROM DUAL
), TB_B AS(
SELECT '가' COM, 1 NAME1, 4 NAME2, 5 NAME3, 6 NAME4 FROM DUAL
UNION ALL SELECT '나' COM, 3 , 1 , 1 , 2 FROM DUAL
UNION ALL SELECT '다' COM, 2 , NULL , NULL , 2 FROM DUAL
UNION ALL SELECT '라' COM, NULL , 2 , NULL , NULL FROM DUAL
UNION ALL SELECT '마' COM, 5 , NULL , 2 , NULL FROM DUAL
UNION ALL SELECT '바' COM, NULL , 1 , NULL , 2 FROM DUAL
UNION ALL SELECT '사' COM, NULL , NULL , 3 , NULL FROM DUAL
UNION ALL SELECT '아' COM, NULL , 4 , NULL , NULL FROM DUAL
UNION ALL SELECT '자' COM, 5 , NULL , 1 , NULL FROM DUAL
UNION ALL SELECT '차' COM, NULL , 6 , NULL , 7 FROM DUAL
)
SELECT /*+ LEADING( A ) FULL( A ) USE_NL( A B ) PUSH_PRED( B ) */ A.NAME, COUNT( DISTINCT B.COM ) COM
FROM TB_A A
, (SELECT NAME1 NAME, COM FROM TB_B
UNION ALL
SELECT NAME2, COM FROM TB_B
UNION ALL
SELECT NAME3, COM FROM TB_B
UNION ALL
SELECT NAME4, COM FROM TB_B
) B
WHERE A.NAME = B.NAME(+)
GROUP BY A.NAME
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입