안녕하세요.
아래 비슷한 질문을 드렸는데 그보다 더 정교한 결과물이 필요해 추가적인 조회결과에 대해 조언을 부탁드립니다~
ID | PARENT_ID | CNT | R_DATE |
1 | 1 | 2014-01-01 | |
2 | 1 | 2 | 2014-01-08 |
3 | 1 | 3 | 2014-02-11 |
4 | 1 | 1 | 2014-04-11 |
5 | 3 | 2014-02-11 | |
6 | 2 | 2 | 2014-08-01 |
7 | 2 | 4 | 2014-07-25 |
8 | 1 | 2014-04-27 | |
9 | 5 | 5 | 2014-01-01 |
10 | 5 | 9 | 2014-01-01 |
위 와 같은 트리구조의 데이터를 가지는 테이블이 있을때
ID | PARENT_ID | CNT | R_DATE |
1 | 1 | 2014-01-01 | |
2 | 1 | 2 | 2014-01-08 |
3 | 1 | 3 | 2014-02-11 |
4 | 1 | 1 | 2014-04-11 |
5 | 3 | 2014-02-11 | |
6 | 2 | 2 | 2014-08-01 |
7 | 2 | 4 | 2014-07-25 |
8 | 1 | 2014-04-27 | |
9 | 5 | 5 | 2014-01-01 |
10 | 5 | 9 | 2014-01-01 |
각 Depth 별로 하위에 속하는 모든 CNT 의 값을 SUM 하고 마지막 R_DATE 의 값을 추출하여
원본데이터와 하위를 CNT 값을 SUM 한 TOTAL_CNT 컬럼과 , LAST_DATE 컬럼을 추가하여
아래와 같은 결과로 조회하려고 합니다.
쿼리를 어떻게 작성해야할지 도움요청드립니다.
DB 버전은 MS-SQL2008 입니다.
위 데이터는 샘플용이라서 루트 포함 3Depth 까지만 내려가는데 실제 데이터는 Depth가 더 깊게 들어갑니다.
각 Depth 별 합계가아닌 최상위합계를 구하는 방법은 번호 8114 게시물에 질문등록되어있습니다.
테이블 함수를 이용하시면 좀 편하게 쿼리가 가능 합니다...
create table TREE (
ID VARCHAR(10)
,PARENT_ID VARCHAR(10)
,CNT INT
,RGDATE VARCHAR(10)
)
INSERT INTO TREE VALUES('1','', 1, '2014-01-01')
INSERT INTO TREE VALUES('2','1', 2, '2014-01-08')
INSERT INTO TREE VALUES('3','1', 3, '2014-02-11')
INSERT INTO TREE VALUES('4','1', 1, '2014-04-11')
INSERT INTO TREE VALUES('5','', 3, '2014-02-11')
INSERT INTO TREE VALUES('6','2', 2, '2014-08-01')
INSERT INTO TREE VALUES('7','2', 4, '2014-07-25')
INSERT INTO TREE VALUES('8','', 1, '2014-04-27')
INSERT INTO TREE VALUES('9','5', 5, '2014-01-01')
INSERT INTO TREE VALUES('10','5', 9, '2014-01-01')
*/
WITH RES ( PARENT_ID , ID ,RGDATE, LEV )
AS (
SELECT PARENT_ID , ID , RGDATE , 1 LEV
FROM TREE
WHERE PARENT_ID = ''
UNION ALL
SELECT A.PARENT_ID , A.ID , A.RGDATE, B.LEV + 1 LEV
FROM TREE A JOIN RES B ON A.PARENT_ID = B.ID
)
SELECT PARENT_ID, ID ,RGDATE, LEV
FROM RES
ORDER BY LEV , ID
--------------------------------------------------------------------
CREATE function [dbo].[UTF_DEPT] (@PARENT_ID VARCHAR(10))
RETURNS @RES TABLE
(
PARENT_ID VARCHAR(10)
, ID VARCHAR(10)
,CNT INT
,RGDATE VARCHAR(10)
,LEV INT
)
as
BEGIN
;WITH RES ( PARENT_ID , ID ,CNT,RGDATE, LEV )
AS (
SELECT PARENT_ID , ID ,CNT, RGDATE , 1 LEV
FROM TREE
WHERE PARENT_ID = @PARENT_ID
UNION ALL
SELECT A.PARENT_ID , A.ID ,A.CNT, A.RGDATE, B.LEV + 1 LEV
FROM TREE A JOIN RES B ON A.PARENT_ID = B.ID
)
INSERT @RES
SELECT PARENT_ID, ID ,CNT,RGDATE, LEV
FROM RES
UNION ALL
SELECT @PARENT_ID , ID ,CNT, RGDATE , 0 LEV
FROM TREE
WHERE ID = @PARENT_ID
ORDER BY LEV , ID
RETURN
END
------------------------------------------------------------------
SELECT A.ID , A.CNT , SUM(B.CNT)TOTAL_CNT ,A.RGDATE , MAX(B.RGDATE) LAST_DATE
FROM TREE A
CROSS APPLY
(
SELECT CNT , RGDATE
FROM dbo.UTF_DEPT(A.ID) ) AS B
GROUP BY A.ID ,A.PARENT_ID ,A.CNT ,A.RGDATE
ORDER BY CAST(ID AS INT)