所有字段的自定义别名(按汇总分组)

p8ekf7hl  于 2021-07-27  发布在  Java
关注(0)|答案(1)|浏览(286)

我有这样的table:

Group    - combination of TypeId and ZoneId   

ID   TypeID          ZoneID
--     --                --
1     1                  1 
2     1                  2       
3     2                  1
4     2                  2
5     2                  3
6     3                  3

Object

ID    GroupId
--       --
1         1
2         1
3         2
4         3
5         3
6         3

我想构建一个查询,用于按typeid和zoneid对所有这些表进行分组,其中包含具有这些字段的特定组合的对象数:

ResultTable

TypeId   ZoneId          Number of objects
--         --                 --
1          1                  2 
1          2                  1       
2          1                  3
2          2                  1
2          3                  0
3          3                  0

查询:

SELECT
  group.TypeId,
  group.ZoneId, 
  COUNT(obj.ID) as NumberOfObjects
  FROM[Group] group
  JOIN[Object] obj on obj.GroupID = group.ID 
  GROUP BY group.TypeId, group.ZoneId ORDER BY  group.TypeId

但是!我想在每个组后面添加summary行,使其类似于:

ResultTableWithSummary

TypeId   ZoneId          Number of objects
--         --                 --
1          1                  2 
1          2                  1   
Summary   (empty field)       3 
2          1                  3
2          2                  1
2          3                  0
Summary   (empty field)       4
3          3                  0
Summary    (empty field)      0

问题是我可以使用group by rollup(group.typeid,group.zoneid):

TypeId   ZoneId          Number of objects
--         --                 --
1          1                  2 
1          2                  1   
1         null                3 
2          1                  3
2          2                  1
2          3                  0
2          null               4
3          3                  0
3          null               0

但我不能或不知道如何将摘要行中的not null group.typeid更改为“summary”。我该怎么做?

f3temu5u

f3temu5u1#

最简单的方法是 coalesce() ,但您需要确保类型匹配:

SELECT COALESCE(CONVERT(VARCHAR(255), group.TypeId, 'Summary') as TypeId,
. . .

这不是最通用的方法,因为它不处理实际的 NULL 中的值 GROUP BY 钥匙。在这种情况下,这似乎不是问题。如果是的话,你可以用 CASE 带的表达式 GROUPING() .
编辑:
对于您的特定变体(我觉得很奇怪),您可以使用:

SELECT (CASE WHEN group.TypeId IS NULL OR group.ZoneID IS NULL
             THEN 'Summary' ELSE CONVERT(VARCHAR(255), group.TypeId)
        END) as TypeId,
. . .

实际上,我会使用类似 COALESCE() 在这两列中,所以我不会丢失关于摘要的信息。

相关问题