name grade
SUN ED
SUN DE
SUN BA
SUN AB
SUN DE
SUN ED
예를들어 위와 같은 테이블이 있는데 아래와같이
grade를 특정 값일경우 그 값들이 포함되어있는 갯수를 구하고싶습니다.
NAME COUNT GRAD
SUN 4 ED
SUN 4 DE
SUN 2 BA
SUN 2 AB
SUN 4 DE
SUN 4 ED
보는바와 같이 SUN 이라는 사람들의 GRADE가 AB, BA의 갯수 2. ED.DE의 갯수 4 이렇게 결과를 내고싶습니다.
작은 조언 부탁드립니다.
Comment 5
-
항해자™
2013.03.07 18:05
-
여대생
2013.03.07 19:47
항해자™ 님 조언 감사합니다.
하지만 grade 각각에 대한 갯수가 아니라.
AB, BA 합친 갯수. DE, ED 합친갯수 를 구하려 합니다.
-
건우아빠
2013.03.08 00:27
글자수가 여러개일 경우도 적용
해놓고 보니 여러 쿼리 짜집기네요.
WITH RES
AS (
SELECT 1 NO, 'SUN' name,'ED' grade UNION ALL
SELECT 2 ,'SUN' ,'DE' UNION ALL
SELECT 3 ,'SUN' ,'BA' UNION ALL
SELECT 4 ,'SUN' ,'AB' UNION ALL
SELECT 5 ,'SUN' ,'DE' UNION ALL
SELECT 6 ,'SUN' ,'ED' ) ,
RESULT1 AS (
SELECT A.NO, A.NAME , A.GRADE , SUBSTRING(A.GRADE,B.NUMBER+1 ,1) GRADE_JA
FROM RES A
CROSS APPLY
( SELECT NUMBER
FROM MASTER.DBO.SPT_VALUES
WHERE TYPE = 'P'
AND NUMBER < LEN( A.GRADE) ) AS B ) ,
RESULT2 AS (
SELECT DISTINCT NO
, NAME
, GRADE
, ( SELECT GRADE_JA AS [text()]
FROM RESULT1 B
WHERE B.NO = A.NO
AND B.NAME = A.NAME
AND B.GRADE = A.GRADE
ORDER BY GRADE_JA
FOR XML PATH('') ) AS NEW_GRADE
FROM RESULT1 A )
SELECT NAME
, COUNT(NEW_GRADE) OVER(PARTITION BY NAME , NEW_GRADE ) CNT
, GRADE
FROM RESULT2
ORDER BY NO
-
난키군
2013.03.08 15:48
줄맞추기....기본중의 기본인데....업무때문에 계속 놓쳐가는 저에게 큰 자극제가 됩니다. 건우아버님 최고십니다~!
-
건우아빠
2013.03.08 16:09
복잡한 쿼리를 힘들게 짜놓고 수정하기 난감할때가 많다 보니 어쩔수 없이 줄 맞출려고 합니다..
그래도 2005부터는 with 를 이용해서 단계과정을 분리해서 짜다보니 쿼리도 보기 쉽고 짜기도 많이 수월해 졌죠...
정리해서 짜는게 시간적으로 단축되는것 같아요.
요즘은 인라인뷰를 중첩해서는 거의 안짜죠... 넘 복잡해지고 가독성이 떨어지 다보니 기본작성은 제가 해주고 수정은 다른 사람들이 해서 한눈에 알아보기 쉽게 짜는게 좋구요.
A.NAME
,B.ROW_CNT
,A.GRADE
FROM dbo.TBL_TEST AS A
JOIN (
SELECT
NAME
,GRADE
,COUNT(*) AS ROW_CNT
FROM
GROUP BY
NAME
,GRADE
) AS B
ON B.NAME = A.NAME
AND B.GRADE = A.GRADE