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 个新实体),而不是在查询中对它们进行硬编码 - 如果它们加入会更好然后计算不为空的地方等。

于 2012-04-10T08:23:13.220 回答