데이터 조회시 ROLLUP 함수처럼 특정그룹의 중간에 아래와같은 결과를 나타내는 ROW 를 삽입하고 싶습니다.
관련해서 어떤식으로 접근을 해야할지 조언 부탁드립니다.
Comment 4
-
오늘밤은안돼요
2017.02.21 15:19
-
오라클ㄹ
2017.02.21 16:01
정확히 어떠한 것을 원하시는지 의미를 잘 몰르겠습니닷 ㅠ
-
오늘밤은안돼요
2017.02.21 16:58
간단하게 질문드리면 위 데이터에서
이름 컬럼 기준으로 그룹핑하여
백분율 컬럼의 SUM의 결과를 나타내는 ROW를 중간에 삽입하고 싶습니다.
(나머지 컬럼은 NULL 및 어떤 결과가 나와도 상관없음)
ROLLUP 을 사용해서 도출한 결과중 필요없는 데이터를 조건을 통해 제거하면
원하는 결과도출이 가능하지만 위 표는 질문 샘플이며 실제 데이터 구조는 더 복잡한 상태여서
ROLLUP 사용시 필요없는 데이터가 많이 추가되는 상황입니다.
더 간단하게 처리할수있는 방법이 있는지 문의드립니다.
-
건우아빠
2017.02.21 17:11
하신게 최선이지 않을까요..
다른 방식은 집걔값을 인서트 하지 않음 나오지 않을거구....
아님 어플단에서 집계를 만들어야 합니다.
일단 ROLLUP 을 사용하여 원하는 결과를 도출하긴 하였습니다만 이렇게 처리하는게 맞는지 의문이네요...
다른 좋은 방법이나 위 케이스에서 주로 사용하는 방식이 있으면 조언 및 공유 부탁드립니다.
DECLARE @TEMP_TBL TABLE (
이름 VARCHAR(10)
,업무코드 VARCHAR(20)
,할당시간 INT
,업무시간 INT
)
INSERT INTO @TEMP_TBL VALUES('작업자_A', 'T_001', 40, 8)
INSERT INTO @TEMP_TBL VALUES('작업자_A', 'T_002', 40, 10)
INSERT INTO @TEMP_TBL VALUES('작업자_A', 'T_003', 40, 0)
INSERT INTO @TEMP_TBL VALUES('작업자_B', 'C_001', 50, 11)
INSERT INTO @TEMP_TBL VALUES('작업자_B', 'C_002', 50, 0)
INSERT INTO @TEMP_TBL VALUES('작업자_B', 'T_003', 50, 0)
SELECT
이름
,CASE WHEN 업무코드 IS NULL THEN '미분류' ELSE 업무코드 END As 업무코드
,할당시간, 업무시간
,CASE WHEN 업무시간 IS NULL THEN 100 - SUM(백분율) ELSE SUM(백분율) END 백분율
FROM
(
SELECT
* ,ISNULL(CAST(CAST(업무시간 AS FLOAT)/CAST(할당시간 AS FLOAT)*100 AS DECIMAL), 0) As 백분율
FROM @TEMP_TBL
) TBL
GROUP BY 이름, 업무코드, 할당시간, 업무시간 WITH ROLLUP
HAVING (GROUPING(업무시간) = 0 AND 업무시간 IS NOT NULL)
OR (GROUPING(업무시간) = 1 AND 업무코드 IS NULL)
AND NOT (GROUPING(업무시간) = 1 AND 이름 IS NULL)