결과처럼 구분1,구분2별로 작업할ID와 실제작업ID별로 group by해서 count를 구한다음 비율을 구하는 부분인데
테이블 2번 접근 안하고
1번만 접근해서 결과처럼 뽑아내는 방법있나요.
작업할ID | 실제작업ID | 구분1 | 구분2 |
A | A | C | 20121231 |
A | B | C | 20121231 |
A | A | C | 20121231 |
B | B | C | 20121231 |
A | A | D | 20120630 |
==>결과
구분1 | 구분2 | 실제작업ID | 실제작업ID갯수(1) | 작업할ID | 작업할ID갯수(2) | 비율((1)/(2)) * 100 |
C | 20121231 | A | 2 | A | 3 | 66.66666667 |
D | 20120630 | A | 1 | A | 1 | 100 |
C | 20121231 | B | 2 | B | 1 | 200 |
Comment 2
-
건우아빠
2013.07.17 10:44
-
소희옵하
2013.07.26 20:08
간만에 들렸다가.. 잼있을것 같아 다른 방식으로 하나 올려봅니다..^^
여러 데이타로 검증된 쿼리는 아닙니다..^^;
WITH RES
AS (
SELECT 'A' [작업할ID],'A' [실제작업ID],'C' [구분1] ,'20121231' [구분2] UNION ALL
SELECT 'A' ,'B' ,'C' ,'20121231' UNION ALL
SELECT 'A' ,'A' ,'C' ,'20121231' UNION ALL
SELECT 'B' ,'B' ,'C' ,'20121231' UNION ALL
SELECT 'A' ,'A' ,'D' ,'20120630'
),
RES1 AS
(
SELECT [작업할ID], [실제작업ID], [구분1] ,[구분2]
, ROW_NUMBER() OVER(ORDER BY [구분1], [구분2] ) AS [Rid]
, 1 AS [sRid]
FROM RES
)
SELECT [구분1], [구분2]
, CASE WHEN [Grp] = 0 THEN [작업할ID] ELSE [실제작업ID] END AS [작업ID]
, COUNT(CASE WHEN [Grp]=1 THEN 'X' END) AS [실제작업ID갯수]
, COUNT(CASE WHEN [Grp]=0 THEN 'X' END) AS [작업할ID갯수]
FROM (
SELECT [작업할ID], [실제작업ID], [구분1] , [구분2], GROUPING([sRid]) AS [Grp]
FROM RES1
GROUP BY [작업할ID], [실제작업ID], [구분1] ,[구분2],[Rid],[sRid] WITH ROLLUP
HAVING [Rid] IS NOT NULL
) A
GROUP BY [구분1], [구분2], CASE WHEN [Grp] = 0 THEN [작업할ID] ELSE [실제작업ID] END
말씀대로 크로스 조인을 이용하기 했습니다만 원하시는 형태인지는 한번 스캔 하는것 같은데....
쿼리가 복잡해지네요...
WITH RES
AS (
SELECT 'A' [작업할ID],'A' [실제작업ID],'C' [구분1] ,'20121231' [구분2] UNION ALL
SELECT 'A' ,'B' ,'C' ,'20121231' UNION ALL
SELECT 'A' ,'A' ,'C' ,'20121231' UNION ALL
SELECT 'B' ,'B' ,'C' ,'20121231' UNION ALL
SELECT 'A' ,'A' ,'D' ,'20120630' )
SELECT R.[구분1]
, R.[구분2]
, MAX(CASE WHEN R.NO = 1 THEN R.ID END) [실제작업ID]
, SUM(CASE WHEN R.NO = 1 THEN R.CNT END) [실제작업ID갯수(1)]
, MAX(CASE WHEN R.NO = 2 THEN R.ID END) [작업할ID]
, SUM(CASE WHEN R.NO = 2 THEN R.CNT END) [작업할ID갯수(2)]
, SUM(CASE WHEN R.NO = 1 THEN R.CNT END) / (SUM(CASE WHEN R.NO = 2 THEN R.CNT END)*1.) * 100 [비율((1)/(2)) * 100]
FROM (
SELECT T.NO
, A.[구분1]
, A.[구분2]
, CASE WHEN T.NO = 1 THEN [실제작업ID] ELSE [작업할ID] END ID
, COUNT(*) CNT
, ROW_NUMBER() OVER(PARTITION BY T.NO ORDER BY (CASE WHEN T.NO = 1 THEN [실제작업ID] ELSE [작업할ID] END) , A.[구분2] DESC , A.[구분1] ) SEQ
FROM RES A CROSS JOIN (SELECT 1 NO UNION ALL SELECT 2 ) T
GROUP BY T.NO , A.[구분1] , A.[구분2]
, CASE WHEN T.NO = 1 THEN [실제작업ID] ELSE [작업할ID] END
) R
GROUP BY R.[구분1] , R.[구분2] , R.SEQ
ORDER BY R.SEQ