ID | PARENT_ID | COUNT | 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 | COUNT | 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 |
PARENT_ID 가 없는 최상위 루트를 포함한 모든 자식의 COUNT 를 SUM 하고
루트포함 모든자식중 마지막 DATE를 추출하여
ID | TOTAL_COUNT | LAST_DATE |
1 | 13 | 2014-08-01 |
5 | 17 | 2014-02-11 |
8 | 1 | 2014-04-27 |
위 와 같은 결과를 출력하고자 합니다.
쿼리를 어떻게 작성해야할지 도움을 요청드립니다.
(위 데이터는 샘플용이라서 루트 포함 3Depth 까지만 내려가는데 실제 데이터는 Depth가 더 깊게 들어갑니다.)
Comment 1
-
오늘밤은안돼요
2014.08.07 14:40
이리저리 참고문서 찾아다니면서 아래와 같은 쿼리로 원하는 결과를 얻긴했습니다.
하위 쿼리보다 좋은방식이 있으면 조언부탁드립니다.
DECLARE @TREE TABLE(
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 TBL_PARENT AS
(
SELECT ID, PARENT_ID, CNT, RGDATE,
CONVERT(VARCHAR(MAX), CAST(ID AS VARCHAR(MAX)) + '_') AS P_PATH
FROM @TREE
WHERE PARENT_ID = ''
UNION ALL
SELECT A.ID, A.PARENT_ID, A.CNT, A.RGDATE,
CONVERT(VARCHAR(MAX), B.P_PATH + CAST(A.ID AS VARCHAR(MAX)) + '_') AS P_PATH
FROM @TREE A
INNER JOIN TBL_PARENT B
ON A.PARENT_ID = B.ID
)
SELECT
SUBSTRING(P_PATH, 1, CHARINDEX('_', P_PATH) -1) As ID
,SUM(CNT) As TOTAL_COUNT
,MAX(RGDATE) As LAST_DATE
FROM TBL_PARENT
GROUP BY SUBSTRING(P_PATH, 1, CHARINDEX('_', P_PATH) -1)
ORDER BY SUBSTRING(P_PATH, 1, CHARINDEX('_', P_PATH) -1)