如何转换结果集以使列值成为聚合标题?

Posted

技术标签:

【中文标题】如何转换结果集以使列值成为聚合标题?【英文标题】:How to transform a result set so column values become aggregated headers? 【发布时间】:2021-07-27 13:13:21 【问题描述】:

如果我有一张桌子:

Id Collection Site
1 Example Collection ***.com
2 Example Collection news.ycombinator.com
1 Example Collection ***.com
3 Example Collection reddit.com
4 Programming Sites ***.com
5 Discussion Sites reddit.com

如何将其转换为...

Collection ***.com news.ycombinator.com reddit.com
Example Collection 2 1 1
Programming Sites 1 0 0
Discussion Sites 0 0 1

在类似的实际系统中,原始表中将有 100k+ 行,以及数千个不同的“站点”。转换保留在 SQL 中是可取的。

【问题讨论】:

完成。 mysql 8.0。 没有动态 SQL 是不可能的。 这种转换最好在您的应用程序或前端代码中完成。 SQL 不是为此而设计的。特别是如果您期望“数千列” - 大多数 DBMS 对您可以返回的列数都有限制。返回“数千列”的替代方法是将其聚合到 JSON 结构中。不确定MySQL是否可以做到这一点。你有所有可能站点的列表吗?这是获得零计数的先决条件 是的,只需在您的应用程序代码中处理这个 谢谢。我不希望它是可行的,但值得这个问题。现在在应用层实现。正在考虑数据库可能能够更有效地做到这一点。 【参考方案1】:

假设您只有这三个站点,您可以使用条件聚合:

select collection,
       sum(case when site = '***.com' then 1 else 0 end) as ***_com,
       sum(case when site = 'news.ycombinator.com' then 1 else 0 end) as news_ycombinator_com,
       sum(case when site = 'reddit.com' then 1 else 0 end) as reddit_com
from t
group by collection;

【讨论】:

谢谢,对不起,不,应该说,示例中的“站点”列表应假定为可变的(在不适用于站点/集合但具有类似的结构)。 如果您有数千个站点,您甚至可能无法将其作为表格返回。

以上是关于如何转换结果集以使列值成为聚合标题?的主要内容,如果未能解决你的问题,请参考以下文章

如何链接 Django 查询集以保留单个顺序

存储结果集以供以后获取

如何在 django 会话中存储查询集以进行分页

Excel VBA - 搜索范围和连接的 SQL ADODB 记录集以在列中匹配写入结果集

将分类值转换为布尔列 SQL

在 impala 中更改表:使列成为主键