如何转换结果集以使列值成为聚合标题?
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;
【讨论】:
谢谢,对不起,不,应该说,示例中的“站点”列表应假定为可变的(在不适用于站点/集合但具有类似的结构)。 如果您有数千个站点,您甚至可能无法将其作为表格返回。以上是关于如何转换结果集以使列值成为聚合标题?的主要内容,如果未能解决你的问题,请参考以下文章