2017-01-18 4 views
3

나는 우리의 사업상의 이유로 까다로운 그룹화 문제가, 내가 방법한다는 점에서 그룹 그것에 필요한이만들기 조건부 집계

 

---------------------------- 
| NAME | TYPE | VALUE | 
---------------------------- 
| N1 | T1 | V1 | 
| N1 | T2 | V2 | 
| N1 | NULL | V3 | 
| N2 | T2 | V4 | 
| N2 | NULL | V5 | 
| N3 | NULL | V6 | 
----------------------------- 

같은 값을 가진 테이블을 가지고

  • 첫 번째 레벨 그룹은 이름으로 표시됩니다. 두 번째 레벨에서
  • ,
    • 가능한 유형 함께 T1, T2 및 NULL, 그룹 T1 및 NULL이다 및 T2는 별도로 그룹화 있다.
    • 사용 가능한 유형이 T2 및 NULL이면 T2와 함께 NULL을 그룹화하십시오.
    • NULL 만 사용할 수있는 유형이면 그대로 사용하십시오.

상기 테이블에 대한 기대의 O/P는이고,

 
---------------------------- 
| N1 | T1 | V1+V3 | 
| N1 | T2 | V2 | 
| N2 | T2 | V4+V5 | 
| N3 | NULL | V6 | 
----------------------------- 

하면 눈송이 SQL 이것을 달성하는 방법. 또는 다른 서버, 그래서 내가 Snowflake에 상응하는 것을 찾을 수 있습니다.

답변

3

다음 조회가 작동해야

SELECT t1.NAME, COALESCE(TYPE, MIN_TYPE), SUM(VALUE) 
FROM mytable AS t1 
JOIN (
    SELECT NAME, MIN(TYPE) AS MIN_TYPE 
    FROM mytable 
    GROUP BY NAME 
) AS t2 ON t1.NAME = t2.NAME  
GROUP BY t1.NAME, COALESCE(TYPE, MIN_TYPE) 

쿼리 NAMEMIN(TYPE) 값을 추출하기 위해 도출 된 테이블을 사용한다. COALESCE을 사용하면 NULLT1 또는 T2으로 변환 할 수 있습니다.

편집 : 다음과 같은 쿼리를 사용하여 예상되는 결과 세트의 피벗 버전을 만들 수 있습니다

:

SELECT NAME, 
     CASE 
      WHEN T1SUM IS NULL THEN 0 
      ELSE COALESCE(T1SUM, 0) + COALESCE(NULLSUM,0) 
     END AS T1SUM, 
     CASE 
      WHEN T1SUM IS NULL AND T2SUM IS NOT NULL 
      THEN COALESCE(T2SUM, 0) + COALESCE(NULLSUM,0) 
      ELSE COALESCE(T2SUM, 0) 
     END AS T2SUM, 
     CASE 
      WHEN T1SUM IS NULL AND T2SUM IS NULL THEN COALESCE(NULLSUM,0) 
      ELSE 0 
     END AS NULLSUM 
FROM (
    SELECT NAME, 
      SUM(CASE WHEN TYPE = 'T1' THEN VALUE END) AS T1SUM, 
      SUM(CASE WHEN TYPE = 'T2' THEN VALUE END) AS T2SUM, 
      SUM(CASE WHEN TYPE IS NULL THEN VALUE END) AS NULLSUM 
    FROM mytable 
    GROUP BY NAME) AS t 
+0

그게 전부는 냉각. 자체 조인없이 달성 될 수 있습니까? 'mytable'자체는 큰 집계 결과의 추상화입니다. – Kannan

+1

@ 카난 내가 만든 편집을 확인하십시오. –