2012-04-10 6 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 

あなたがスキーマ情報&のサンプルデータを提供していないのにまだ微妙なことがいくつかあります。これに頼らなければならないという事実は、あなたのスキーマに問題があるかもしれません。たとえば、私は通常、チワワとラブラドールを定義した別のテーブルを犬とシャムとタブーとして定義しています(これらのテーブルをハードコーディングするのではなく、ほとんど2つの新しいエンティティ)。ヌル以外の場所で数えられます。

+0

この回答は、ルックアップテーブルに左外部結合で集約選択を書き込むのに役立ちました。ありがとうございました! –

関連する問題