SQL聚合使用一一列的group by

Posted

技术标签:

【中文标题】SQL聚合使用一一列的group by【英文标题】:SQL aggregation using group by of columns one by one 【发布时间】:2020-06-06 07:10:47 【问题描述】:

场景:

下面是我的桌子。

+-------+-----------+--------+--------+
|col2   |col3       |col4    |col5    |
+-------+-----------+--------+--------+
|    1.0|          2|       a|      a1|
|    1.0|          1|       a|      a2|
|    1.0|          2|       b|      a3|
|    2.0|          1|       a|      a1|
|    2.0|          1|       a|      a2|
+-------+-----------+--------+--------+

我需要得到如下聚合结果。

+-------+-----------+-----------+-----------+-----+
|col2   |col3       | field_name|field_value|count|
+-------+-----------+-----------+-----------+-----+
|    2.0|          1|   col3    |          1|    2|
|    1.0|          1|   col3    |          1|    1|
|    1.0|          2|   col3    |          2|    2|
|    2.0|          1|   col4    |          a|    2|
|    1.0|          1|   col4    |          a|    1|
|    1.0|          2|   col4    |          a|    1|
|    1.0|          2|   col4    |          b|    1|
|    1.0|          1|   col5    |         a2|    1|
|    1.0|          2|   col5    |         a1|    1|
|    1.0|          2|   col5    |         a3|    1|
|    2.0|          1|   col5    |         a1|    1|
|    2.0|          1|   col5    |         a2|    1|
+-------+-----------+-----------+-----------+-----+

已实施的解决方案:

我通过创建三个不同的表 [T1、T2、T3] 来实现该解决方案。 然后对于每个表,我以编程方式创建了 [rowset1, rowset2, rowset3] 以将所有表合并到一个表中

select col2, col3, col3, count(*) from calc group by col2, col3;
T1 :
|col2   |col3       |col3       |count|
+-------+-----------+-----------+-----+
|    2.0|          1|          1|    2|
|    1.0|          1|          1|    1|
|    1.0|          2|          2|    2|
+-------+-----------+-----------+-----+

rowset1 = [[2.0,1,col3,1,2,18000], [1.0,1,col3,1,1,18000], [1.0,2,col3,2,2,18000]]

select  col2, col3,  col4, count(*) from calc group by col2, col3, col4;
T2:
+-------+-----------+--------+-----+
|col2   |col3       |col4    |count|
+-------+-----------+--------+-----+
|    2.0|          1|       a|    2|
|    1.0|          1|       a|    1|
|    1.0|          2|       a|    1|
|    1.0|          2|       b|    1|
+-------+-----------+--------+-----+
rowset2 = [[2.0,1,col4,a,2,18000], [1.0,1,col4,a,1,18000], [1.0,2,col4,a,1,18000],[1.0,2,col4,b,1,18000]]

select col2, col3, col5 , count(*) from calc group by col2, col3, col5;
T3:
+-------+-----------+--------+-----+
|col2   |col3       |col5    |count|
+-------+-----------+--------+-----+
|    1.0|          1|      a2|    1|
|    1.0|          2|      a1|    1|
|    1.0|          2|      a3|    1|
|    2.0|          1|      a1|    1|
|    2.0|          1|      a2|    1|
+-------+-----------+--------+-----+

rowset3 = [1.0,2,col5,b,1,18000], [1.0,1,col5,a2,1,18000], [1.0,2,col5,a1,1,18000], [1.0,2,col5,a3,1,18000], [2.0,1,col5,a1,1,18000], [2.0,1,col5,a2,1,18000]]


问题

如何在 SQL 中实现相同的功能,而无需创建 rowset1、2、3 并将其组合到单个表中?

【问题讨论】:

用您正在使用的数据库标记您的问题。 它对所有人都是通用的,但我已经标记了它。 相信你在找pivot函数 @Singh。 . .一点也不。您正在运行查询。这些查询是针对数据库运行的。该数据库的功能不同于现有的所有其他数据库。 【参考方案1】:

如果我理解正确,您希望将三个聚合合二为一。一种方法是使用cross join 引入信息来区分每个聚合:

select col2, col3, field_name,
       (case when field_name = 'col3' then col3
             when field_name = 'col4' then col4
             when field_name = 'col5' then col5
        end) as field_value,
       count(*) as cnt
from t cross join
     (select 'col3' as field_name union all
      select 'col4' as field_name union all
      select 'col5' as field_name
     ) f
group by col2, col3, field_name, field_value
order by field_name, col2 desc, col3;

Here 是一个 dbfiddle。

【讨论】:

@Singh。 . . (1) 我在查询中添加了一个 dbfiddle 和一个 order by。 (2) 这会在您的问题中产生完全相同的结果集。这个问题得到了回答。

以上是关于SQL聚合使用一一列的group by的主要内容,如果未能解决你的问题,请参考以下文章

按 Sql Server 中的一列分组并按未包含在聚合函数或 GROUP BY 子句中的另一列排序

mysql之聚合函数group byhaving

SQL 聚合函数一定要跟group by以及NULL的关系的案例精讲

在 group by 中,有没有办法告诉 SQL 特定列不需要聚合函数?

可以单独对多个列进行 GROUP BY 并使用 django ORM 将它们中的每一列聚合到其他列?

使用 Group by 进行多次聚合计算