如何根据 Transact-sql 中的 group-by 子句中的项目设置类别?

Posted

技术标签:

【中文标题】如何根据 Transact-sql 中的 group-by 子句中的项目设置类别?【英文标题】:How to set category based on items in a group-by clause in Transact-sql? 【发布时间】:2012-04-10 06:20:32 【问题描述】:

我有一组记录,一旦组合在一起,我想根据该组中的记录组合分配一个类别..

想知道解决此问题的最佳方法..我能想到的就是下面的内容,但认为可能有更聪明的方法来做到这一点(也许使用 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 个新实体),而不是在查询中对它们进行硬编码 - 如果它们加入会更好然后计算不为空的地方等等。

【讨论】:

这个答案帮助我编写了一个带有左外连接的聚合选择来查找表,谢谢!

以上是关于如何根据 Transact-sql 中的 group-by 子句中的项目设置类别?的主要内容,如果未能解决你的问题,请参考以下文章

5.Transact-SQL编程

sqlgo是啥意思,如何使用?

@@ROWCOUNT (Transact-SQL)

如果已附加数据库,如何使用 Transact-SQL 和 SQL Server 2008 R2 进行测试? [复制]

Transact-SQL统计某字段中的值第一次出现后的2小时内出现的次数

如何修改 SQL Server 代理主作业 (Transact-SQL)