0

一度グループ化された一連のレコードがあり、そのグループ内のレコードの組み合わせに基づいてカテゴリを割り当てたい..

これについて最善の方法を考えていました..私が考えることができるのは、私が以下に持っているものだけですが、それを行うためのより賢い方法があるかもしれないと思いました(おそらく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
4

1 に答える 1

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 つの新しいエンティティ) を通常見たいと思います。そして、null でない場所などをカウントします。

于 2012-04-10T08:23:13.220 に答える