SQL:从 2 列数据源创建聚合表

Posted

技术标签:

【中文标题】SQL:从 2 列数据源创建聚合表【英文标题】:SQL: Creating an aggregated table from a 2-column data source 【发布时间】:2021-07-04 07:14:40 【问题描述】:

我在数据库中有一个表,我想将其中的问题和答案汇总到一个更具可读性的数据表中。源表??????

+-----+----------------+----------------------------+----------------+
| QID | Date Submitted |          Question          |     Answer     |
+-----+----------------+----------------------------+----------------+
|   0 | 08/04/2021     | companyName                | Yaneev         |
|   1 | 08/04/2021     | humanRightPolicy           | George Micheal |
|   2 | 08/04/2021     | accountManagerMobileNumber | 7474236843     |
|   3 | 08/04/2021     | swiftCode                  | AOEU326        |
|   4 | 03/04/2021     | companyName                | Eimbee         |
|   5 | 03/04/2021     | humanRightPolicy           | Revvie George  |
|   6 | 03/04/2021     | accountManagerMobileNumber | 7475123843     |
|   7 | 03/04/2021     | swiftCode                  | AOEU324        |
|   8 | 04/04/2021     | companyName                | Yaneev         |
|   9 | 04/04/2021     | humanRightPolicy           | Mark Fox       |
|  10 | 04/04/2021     | accountManagerMobileNumber | 74742121231    |
|  11 | 04/04/2021     | swiftCode                  | 124eoKK        |
+-----+----------------+----------------------------+----------------+

我希望“目标”表看起来像什么????

+--------------+-------------------+----------------------------+-----------+
| Company Name | humanRightsPolicy | accountManagerMobileNumber | swiftCode |
+--------------+-------------------+----------------------------+-----------+
| Yaneev       | George Micheal    |                 7474236843 | AOEU326   |
| Eimbee       | Revvie George     |                 7475123843 | AOEU324   |
+--------------+-------------------+----------------------------+-----------+

我也想知道这是一种什么样的操作,因为我觉得这在任何方面都不新鲜。

【问题讨论】:

SQL 表表示无序(多)集。如果您的表没有指定行顺序的列,则您无法做您想做的事情,因为未定义数据的顺序。 向我们展示不同的名字和答案。 @jarlh,添加了示例问题和答案。希望对您有所帮助。 【参考方案1】:

SQL 表代表无序 集合。让我假设您有一个排序列。使用这样的列,您可以为同一公司的每组行分配一个组,然后使用条件聚合:

select max(case when question = 'Company Name' then answer end) as company_name,
       max(case when question = 'Q1' then answer end) as q1,
       max(case when question = 'Q2' then answer end) as q2,
       max(case when question = 'Q3' then answer end) as q3       
from (select t.*,
             sum(case when question = 'Company Name' then 1 else 0 end) over (order by <ordering col>) as grp
      from t
     ) t
group by grp;

请注意,这回答了您提出的问题,所有问题都是已知的,因此结果列都是已知的。如果事先不知道问题,则需要使用动态 SQL(即将查询构造为字符串,然后执行)。如何做到这一点完全取决于您使用的数据库。

编辑:

在旧版本的 mysql 中,您可以使用子查询:

select max(case when question = 'Company Name' then answer end) as company_name,
       max(case when question = 'Q1' then answer end) as q1,
       max(case when question = 'Q2' then answer end) as q2,
       max(case when question = 'Q3' then answer end) as q3       
from (select t.*,
             (select count(*)
              from t t2
              where t2.question = 'Company Name' and
                    t2.<ordering col> <= t.<ordering col>
             ) as grp
      from t
     ) t
group by grp;

【讨论】:

您好,有一个排序栏,为了清楚起见,省略了。这里的问题是答案主要是字符串,因此 max() 运算符不适用于这些。无论如何,我会尝试使用这种“case when”方法,谢谢。 @Wiki 。 . .当然 max() 适用于字符串。人们从哪里得到它没有的想法?你绝对不是第一个有这种误解的人。 我来自编程背景 - SQL 对我来说非常陌生。 javascript Math.max() 仅对数字进行运算 - 因此是(错误的)假设! 嗨@Gordon Linoff,我使用的是不支持OVER() 窗口函数的旧版本的MySQL。有什么替代方案? @Wiki 。 . .您应该使用您正在使用的数据库进行标记。我用替代方法编辑了答案。

以上是关于SQL:从 2 列数据源创建聚合表的主要内容,如果未能解决你的问题,请参考以下文章

SQL基础教程(第2版)第3章 聚合与排序:3-1 对表进行聚合查询

从 HBASE 数据返回聚合

3 聚合与排序

[SQL] SQL 基础知识梳理- 聚合和排序

我想在数据库中的一个表中查询出全部数据 并且按照一个分组和排序

SQL.基础构建-第三节(3/4)