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 6665 게시물 읽기
No. 6665
SQL join
작성자
ohyouknow
작성일
2013-05-10 10:40
조회수
7,974

---------------------------------------- SQL 1

select a.rank, count(*) NO from DCode a where a.Code like '1233121%' group by rank order by a.RANK

rank NO

7 1

8 5

9 25

10 100

11 500

---------------------------------------- SQL 2

select rank,COUNT from DCodeCount where codeid in (select MIN(codeid) from DCode where Code like '1233121%')

rank COUNT

7 1

8 5

9 25

----------- SQL : 제가 원하는 SQL 결과물이 다음과 같이 나오게 하려면 어떻게 해야하나요?

rank NO COUNT

7 1 1

8 5 5

9 25 25

10 100

11 500

답변 감사드립니다.

이 글에 대한 댓글이 총 4건 있습니다.

퇴근에 앞서 급한 마음에 무식한 답변 하나 올려봅니다. (살짝 스키마가 없다는 핑게와 더불어.. ㅋ)
 
with aa ( rank, NO )
AS (
select a.rank, count(*) NO 
from DCode a 
where a.Code like '1233121%' 
group by rank 
order by a.RANK
)
,
bb (rank, count )
AS(
select rank,COUNT 
from DCodeCount 
where codeid in (
select MIN(codeid) from DCode where Code like '1233121%'
)
)
SELECT aa.rank, aa.no, bb.count
FROM aa
LEFT JOIN bb
ON aa.rank = bb.rank
;
 

우욱님이 2013-05-10 18:46에 작성한 댓글입니다. Edit

우욱님,
답변 너무너무 감사합니다.
그런데 다음과 같은 에러가 발생하네요. T_T

Msg 1033, Level 15, State 1, Line 8
TOP 또는FOR XML이 지정되어 있지 않은 경우, 뷰,인라인 관수,파생테이블,서브쿼리,및 공통테이블식에서는 ORDER BY 구는 무효입니다.

ohyouknow님이 2013-05-10 23:08에 작성한 댓글입니다. Edit

처음에 드렸던 쿼리는 order by를 밖으로 미처 안 뺐었군요.. 해서 아마

 

WITH aa ( rank, NO )
AS (
select a.rank, count(*) NO 
from DCode a 
where a.Code like '1233121%' 
group by rank 
)
,
bb (rank, count )
AS(
select rank,COUNT 
from DCodeCount 
where codeid in (
select MIN(codeid) from DCode where Code like '1233121%'
)
)
SELECT aa.rank, aa.no, bb.count
FROM aa
LEFT JOIN bb
ON aa.rank = bb.rank
order by aa.RANK
;
 
하시면 돌아갈 것으로 보입니다. 다만 올려져 있던 쿼리를 기준으로 작성을 하다 보니 썩 효율적이지는 않을 것 같아 다음과 같이 다시 작성해봤습니다. (역시 테이블 구조나 data를 볼 수 없는 상태에서 작성하다보니 또 오류가 있을 수도 있겠다...는 생각이 듭니다.)
 
SELECT bb.rank, bb.NO, DCodeCount.COUNT
FROM(
SELECT rank, NO, MIN( minCodeid ) AS minCodeid
FROM(
SELECT rank, COUNT(*) AS NO, MIN( codeid ) AS minCodeid
FROM DCode
WHERE Code like '1233121%' 
GROUP BY rank
) AS kk
GROUP BY rank, NO
) AS bb
LEFT JOIN DCodeCount
ON bb.rank = DCodeCount.rank AND bb.minCodeid = DCodeCount.codeid
;
 

 

 

우욱님이 2013-05-12 01:57에 작성한 댓글입니다. Edit

우욱님,
진심 어린 답변 너무너무 감사합니다.

결과가 잘 나오네요.
다시 한번 감사 드립니다.
 

ohyouknow님이 2013-05-13 12:40에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
6670다른테이블의 데이타 Sum해서 차액을 구하고 싶습니다. [3]
둥둥이
2013-05-14
7837
6668MS-SQL 2008 R2 데이터 이관 [1]
이규영
2013-05-13
8473
6667REPLACE VALUE [5]
ohyouknow
2013-05-13
7380
6665SQL join [4]
ohyouknow
2013-05-10
7974
6664MS SQL 교육 문의 [1]
namkyu
2013-05-09
7633
6662테이블 복제에 대해 질문드려요 [3]
whiteboy
2013-05-03
7886
6661로그테이블에 인덱스를 걸어야하나요? [3]
whiteboy
2013-04-29
8420
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2023 DSN, All rights reserved.
작업시간: 0.051초, 이곳 서비스는
	PostgreSQL v16.1로 자료를 관리합니다