2012-04-10 1 views
0

한 번 그룹화 된 레코드 세트가 그룹의 레코드 조합을 기반으로 카테고리를 할당하고 싶습니다.Transact-sql의 group-by 절에있는 항목을 기반으로 범주를 설정하는 방법?

가장 좋은 방법은 궁금합니다.이 모든 것에 대해 생각할 수 있습니다. 나는 아래 가지고 있지만 그것을 할 수있는 더 현명한 방법이 될 수있다 생각했습니다 것입니다 (아마도 UDF를 사용하고 계십니까?)

SELECT * 
, case when productgroup in ('chihuaha','labrador') then 1 else 0 end AS Dog 
, case when productgroup in ('siamese', 'tabby') then 1 else 0 end as Cat 
INTO #tmp_items 
FROM dbo.Items 

SELECT docket 
     , sum(value) 
     , case when sum(Dog) > 0 and sum(Cat) > 0 then 'Dog and Cat' 
       when sum(Dog) > 0 and sum(Cat) = 0 then 'Dog Only' 
       when sum(Dog) = 0 and sum(Cat) > 0 then 'Cat Only' 
      end 
      as Purchase_Type 
FROM #tmp_items 
GROUP BY docket 

답변

1

그 임시 테이블 등을 방지하는 간단한 방법은 매우 간단에서 쿼리를 수행하는 것입니다 CTE :

WITH tmp_items (Docket, Value, Dog, Cat) 
      AS (SELECT Docket , 
         Value , 
         CASE WHEN productgroup IN ('chihuaha', 'labrador') THEN 1 
          ELSE 0 
         END AS Dog , 
         CASE WHEN productgroup IN ('siamese', 'tabby') THEN 1 
          ELSE 0 
         END AS Cat 
       FROM  dbo.Items 
      ) 
    SELECT Docket , 
      SUM(Value) , 
      CASE WHEN SUM(Dog) > 0 AND SUM(Cat) > 0 THEN 'Dog and Cat' 
       WHEN SUM(Dog) > 0 AND SUM(Cat) = 0 THEN 'Dog Only' 
       WHEN SUM(Dog) = 0 AND SUM(Cat) > 0 THEN 'Cat Only' 
      END AS Purchase_Type 
    FROM tmp_items 
    GROUP BY docket 

스키마 정보 & 샘플 데이터를 제공하지 않았으므로 일부 조정할 수는 있지만 여전히이 문제에 의존해야한다는 사실은 스키마에 문제가 있음을 나타낼 수 있습니다. 예를 들어, 일반적으로 Chihuahua와 Labrador를 개와 샴브라라고 정의한 다른 테이블을보고 싶습니다. 쿼리에 하드 코딩하지 않고 고양이 (2 개의 새로운 엔티티)를 탭으로 사용하는 것이 좋습니다. 그리고 나서 널이 아닌 곳에서 세어 보았습니다.

+0

이 답변은 왼쪽 외부 조인이있는 집계 선택을 룩업 테이블에 작성하는 데 도움이되었습니다. –

관련 문제