如何将单行分组为一个?

Posted

技术标签:

【中文标题】如何将单行分组为一个?【英文标题】:How to group single rows in one? 【发布时间】:2021-04-01 21:19:01 【问题描述】:

美好的一天。我有一个包含列的表:年份、项目、计数。 假设我在 db 表中有以下行:

2007 item1 value1
2007 item2 value2
2008 item1 value3
2008 item2 value4
2009 item1 value5
2009 item2 value6

是否有可能通过 1 个查询得到这样的结果:

2007 value1 value2
2008 value3 value4
2009 value5 value6

我知道如何分组等等,问题是每年的项目数量可能不同,所以假设我们总共有 5 个项目,我需要以下输出(如果没有找到,添加 0) :

2007 value1 value2 0 0      0  
2008 0      value3 0 value4 0 

【问题讨论】:

这能回答你的问题吗? How to concatenate strings of a string field in a PostgreSQL 'group by' query? Arun Palanisamy 不,请再次查看我的问题。问题是输出中的每一行都应该以相同的顺序包含所有值,如果不存在,则为 0。 为什么02008 的第一列中?你怎么点这个? 请阅读我的第二个示例,跳过第一部分,仅包含 2 个项目。它没有提供信息。换句话说,我有 5 件商品待售,每件商品可能有一些年份的销售数据,也可能没有。我每年都需要一个数组,即使数据库中没有行,它们都将以相同的顺序出现。 【参考方案1】:

你似乎想要一些类似的东西:

select year
    coalesce(sum(value) filter(where item = 'item1'), 0) as value1,
    coalesce(sum(value) filter(where item = 'item2'), 0) as value2,
    coalesce(sum(value) filter(where item = 'item3'), 0) as value3,
    coalesce(sum(value) filter(where item = 'item4'), 0) as value4
from mytable
group by year

这假定value 是数字数据类型。

【讨论】:

以上是关于如何将单行分组为一个?的主要内容,如果未能解决你的问题,请参考以下文章

Mysql union如何将返回的3行分组为单行

如何按键分组并在单行的其他列中返回最小值/最大值?

如何在选择 oracle 中将值分组到单行

Crystal Report,根据Criteria将行分组为单行

关于多个分组的问题。如何从组中获取单行?

DQL---条件查询单行函数多行函数分组函数数据类型