database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
Oracle
Informix
Sybase
ㆍMS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
MS-SQL Q&A 3573 게시물 읽기
No. 3573
테이블간 COUNT(*)를 구하려고 하는데요..넘 어려워요
작성자
초짜잉잉
작성일
2007-06-18 18:01
조회수
6,580

ㅜㅜ 하루종일 헤맸습니다...


쉬운것같은데...안되네요...ㅡㅜ 도와주세요....


TABLE A : NO,EMPL,NAME    (KEY :NO)

NO, EMPL,  NAME

======================

1,   1111111, ㄱㄱㄱ

2,   2222222, ㄴㄴㄴ

3,   3333333, ㄷㄷㄷ


TABLE B:  NO,AAA,BBB         (KEY :NO)

NO, AAA,  BBB

=======================

1,   XXXX, ㄹㄹㄹㄹ

1,   YYYY, ㅁㅁㅁㅁ

3,   ZZZZ, ㅂㅂㅂㅂ


TABLE C:  NO,CCC               (KEY :NO)

NO,CCC

======================

1,   !

2,   @

2,  #

3,  $


이렇게 테이블이 3개 있는데요...

A테이블의 NO와 같은 값을 갖고 있는 B테이블의 갯수와 C테이블의 갯수를 구하고 싶습니다...

A테이블의 NO가 있다고 해서 반듯이 B,C에 NO가 있는건 아니구요...


이런 결과를 원하는건데요...

A테이블의 NO,EMPL,NAME,B테이블의 COUNT,C테이블의 COUNT를 구하고 싶습니다.


아래와 같은 결과로요...


1,1111111,ㄱㄱㄱ,2,1

2,2222222,ㄴㄴㄴ,0,2

3,3333333,ㄷㄷㄷ,1,1


ㅜㅜ 도와주세요.....

제발요~~ 하루종일 이렇게 저렇게 해보다가 머리뽀개집니다...


초짜라서 죄송해요.....ㅜㅜ

이 글에 대한 댓글이 총 4건 있습니다.
SELECT NO
     , EMPL
     , NAME
  FROM A LEFT OUTER JOIN B ON A.NO = B.NO
         LEFT OUTER JOIN C ON A.NO = C.NO
 WHERE ...

일단 이게 아우터 조인이고
SQL2005 부터는 *= 형식의 아우터 조인을 지원하지 않기 때문에
ANSI 조인형식에 익숙해지시는게 좋을거 같아서 ANSI 조인형식으로 아우터조인을 걸었습니다.

MS가 ANSI로 나갈 모양입니다.

일단 기본 원리는 아우터조인을 말하는건데... 원하시는 결과는 서브쿼리가 되야겠네요.

SELECT NO
     , EMPL
     , NAME
     , ISNULL( ( SELECT COUNT(*)
                   FROM B
                  WHERE NO = A.NO ), 0 ) AS COUNT_B
     , ISNULL( ( SELECT COUNT(*)
                   FROM C
                  WHERE NO = A.NO ), 0 ) AS COUNT_C
  FROM A
 WHERE ...
임재흥(임재흥)님이 2007-06-18 18:19에 작성한 댓글입니다.
이 댓글은 2007-06-18 18:23에 마지막으로 수정되었습니다.

1. LEFT OUTER JOIN 
   기준 테이블 하나에 2개이상의 테이블이 OUT JOIN일때는  주의 필요...


SELECT RA.NO, RA.EMPL, RA.NAME,RA.CNT B_CNT,RB.CNT C_CNT
  FROM ( SELECT TA.NO, TA.EMPL, TA.NAME, COUNT(TB.NO)  CNT
    FROM  TA  LEFT OUTER JOIN TB  ON TA.NO = TB.NO
 GROUP BY  TA.NO, TA.EMPL, TA.NAME )AS RA
          INNER JOIN  
 (SELECT TA.NO, TA.EMPL, TA.NAME, COUNT(TC.NO)  CNT
    FROM  TA  LEFT OUTER JOIN TC  ON TA.NO = TC.NO
 GROUP BY  TA.NO, TA.EMPL, TA.NAME ) RB
           ON RA.NO = RB.NO  AND RA.EMPL = RB.EMPL AND RA.NAME =  RB.NAME


 2. SUBQUERY

SELECT A.NO, A.EMPL, A.NAME ,
             (SELECT COUNT(*) FROM TB WHERE NO  =  A.NO) B_CNT,
             (SELECT COUNT(*) FROM TC WHERE NO =  A.NO) C_CNT
   FROM TA A

지나가다가님이 2007-06-18 18:37에 작성한 댓글입니다. Edit

아웅........답글 주신 두분


너무너무 너~~~~~~무 감사합니다.........

계속 LEFT OUTER JOIN하다가 미칠뻔했거든요........



두분 천재예요......ㅜㅜ 감사합니다......


초짜잉잉님이 2007-06-19 08:15에 작성한 댓글입니다.
이 댓글은 2007-06-19 08:19에 마지막으로 수정되었습니다. Edit


 TABLE A의 NO값이 유일할 경우, [TABLE A].EMPL와 [TABLE A].NAME가 유일할 경우 
아래의 쿼리와 같이 하셔도 원하시는 결과를 얻을 수 있습니다.

SELECT D.NO, MIN(EMPL) AS EMPL , MIN(NAME) AS NAME, MAX(D.CNT) as B_CNT , COUNT(C.NO) AS C_CNT    --COUNT 안에는 꼭 컬럼명이 있어야 합니다.
 FROM (                                                                                           --(집계 함수는 NULL인 값은 처리 대상에서 제외) 
       SELECT A.no, MAX(A.EMPL) as EMPL, MAX(NAME) AS NAME , COUNT( B.no) AS cnt
      FROM TABLE_A a LEFT OUTER JOIN TABLE_B  B
           ON(A.no = B.no)
       GROUP BY A.no
  )   D LEFT OUTER JOIN TABLE_C C
         ON(D.NO = C.NO)
GROUP BY D.NO     

가을남자님이 2007-06-20 16:21에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
3576자릿수 문제.. [1]
mssql
2007-06-19
4289
3575convert 관련 질문입니다. [2]
함수
2007-06-19
4195
3574쿼리문제 입니다. [2]
쿼리
2007-06-19
2339
3573테이블간 COUNT(*)를 구하려고 하는데요..넘 어려워요 [4]
초짜잉잉
2007-06-18
6580
3572DB 서버 성능 향상을 위해 고려하고 있는 사항입니다. 조언 부탁드립니다. [1]
최성
2007-06-18
3355
3571sql2000에서 xml 파일 생성하기 [1]
xml
2007-06-15
2979
3570ms-sql server 2005 설치시 오류 문제 질문드립니다.
바다우주
2007-06-15
2400
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.021초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다