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

這個答案幫助我寫一個聚合選擇與左外連接查找表,謝謝! – 2012-04-23 17:08:33

相關問題