【问题标题】:Combining groups in GROUP BY在 GROUP BY 中组合组
【发布时间】:2013-08-13 20:08:35
【问题描述】:

我有一个按字段描述分组的查询。 (总共有 9 个描述。)我需要以某种方式将其中的 3 个描述组合成一组,总共有 7 个描述。我是 sql 查询的新手,所以到目前为止,除了 JOINS 和 WHERE 子句之外,我对任何事情都很迷茫。感谢您的帮助。

SELECT        serviceclass.description, DATEPART(Year, meterread.readdate) AS Year, DATEPART(Month, meterread.readdate) AS Month, SUM(meterread.consumption) 
                     AS Consumption, COUNT(DISTINCT accountservice.account_id) AS Locations
FROM            accountservice INNER JOIN
                     serviceclass ON accountservice.serviceclass_id = serviceclass.serviceclass_id INNER JOIN
                     meterread ON accountservice.accountservice_id = meterread.accountservice_id
WHERE        (@Year = DATEPART(Year, meterread.readdate))
GROUP BY serviceclass.description, DATEPART(Year, meterread.readdate), DATEPART(Month,meterread.readdate)
ORDER BY Year, Month

【问题讨论】:

  • 提供示例描述以及您希望如何对您感兴趣的 3 个进行分组。
  • 您是否总是希望将相同的三个描述组合在一起,或者这三个描述可以不同?

标签: sql sql-server-2008 reporting-services


【解决方案1】:

您可以通过使用CASE 语句来实现此目的。

SELECTGROUP BY 子句中的serviceclass.desription 替换为

CASE
    WHEN serviceclass.description IN ('Desc1','Desc2','Desc3')
        THEN 'JointDescription'
    ELSE serviceclass.description
END

并使用您的三个描述更新 Desc 1 ~ 3,并将联合描述更新为您想要的。

结果:

SELECT CASE
           WHEN serviceclass.description IN ('Desc1','Desc2','Desc3')
               THEN 'JointDescription'
           ELSE serviceclass.description
       END as description, 
       DATEPART(Year, meterread.readdate) AS Year,  
       DATEPART(Month, meterread.readdate) AS Month, 
       SUM(meterread.consumption) AS Consumption, 
       COUNT(DISTINCT accountservice.account_id) AS Locations
FROM accountservice 
INNER JOIN serviceclass ON accountservice.serviceclass_id = serviceclass.serviceclass_id 
INNER JOIN meterread ON accountservice.accountservice_id = meterread.accountservice_id
WHERE        (@Year = DATEPART(Year, meterread.readdate))
GROUP BY CASE
             WHEN serviceclass.description IN ('Desc1','Desc2','Desc3')
                  THEN 'JointDescription'
             ELSE serviceclass.description
         END, 
         DATEPART(Year, meterread.readdate), 
         DATEPART(Month,meterread.readdate)
ORDER BY Year, Month

【讨论】:

    【解决方案2】:

    您通常会使用case 语句来执行此操作,该语句将同时出现在selectgroup by 语句中。比如:

    select (case when serviceclass.description = 'A' then 'B'
                 else serviceclass.description
            end) as description
           . . . -- fill in with query here
    group by (case when serviceclass.description = 'A' then 'B'
                 else serviceclass.description
               end), . . .  -- rest of query goes here
    

    【讨论】:

      猜你喜欢
      • 2015-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-25
      • 2012-03-25
      • 1970-01-01
      • 1970-01-01
      • 2012-08-06
      相关资源
      最近更新 更多