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 对表进行聚合查询