在 SQL 中不进行聚合的数据透视
Posted
技术标签:
【中文标题】在 SQL 中不进行聚合的数据透视【英文标题】:Pivot without aggregation in SQL 【发布时间】:2021-06-21 17:43:13 【问题描述】:我正在尝试弄清楚如何在不聚合的情况下将列旋转到行。
我有一个包含帐户、公司名称和公司百分比的表格。我正在尝试进行调整,以便与该帐户相关的所有公司信息都在同一行。一个帐户可以拥有多少家公司没有限制,我需要包括所有公司。
目前:
Account | Company Name | Company % |
---|---|---|
1 | Company A | Company A% |
1 | Company B | Company B% |
2 | Company B | Company B% |
3 | Company A | Company A% |
3 | Company B | Company B% |
3 | Company K | Company K% |
3 | Company W | Company W% |
预期结果:
Account | Company 1 | Company 1% | Company 2 | Company 2% | Company 3 | Company 3% | Company 4 | Company 4% |
---|---|---|---|---|---|---|---|---|
1 | Company A | Company A% | Company B | Company B% | ||||
2 | Company B | Company B% | ||||||
3 | Company A | Company A% | Company B | Company B% | Company K | Company K% | Company W | Company W% |
【问题讨论】:
在 html 中? SQL?问题是什么? 以 SQL 为中心。谢谢 哪个 DBMS?例如微软 SQL Server、mysql、甲骨文 另外,它是否需要成为具有实际列的真正枢轴,或者像listagg
这样的东西是否可以接受?例如2, "Company B, Company B%"
只是好奇聚合有什么问题?
【参考方案1】:
任何现代的 SQL 实现都有 ROW_NUMBER()
并且可以用于你想要的。
它仍然使用MAX()
将多行折叠成单行,但它被用作pick the one value that isn't NULL
。
没有合理的理由避免使用它。
WITH
sorted AS
(
SELECT
yourTable.*,
ROW_NUMBER() OVER (PARTITION BY account ORDER BY company_name) AS account_row_id
FROM
yourTable
)
SELECT
account,
MAX(CASE WHEN account_row_id = 1 THEN company_name END) AS company_name_1,
MAX(CASE WHEN account_row_id = 1 THEN company_pct END) AS company_pct_1,
MAX(CASE WHEN account_row_id = 2 THEN company_name END) AS company_name_2,
MAX(CASE WHEN account_row_id = 2 THEN company_pct END) AS company_pct_2,
MAX(CASE WHEN account_row_id = 3 THEN company_name END) AS company_name_3,
MAX(CASE WHEN account_row_id = 3 THEN company_pct END) AS company_pct_3,
MAX(CASE WHEN account_row_id = 4 THEN company_name END) AS company_name_4,
MAX(CASE WHEN account_row_id = 4 THEN company_pct END) AS company_pct_4
FROM
sorted
GROUP BY
account
ORDER BY
account
【讨论】:
抱歉,我花了很长时间来测试它,但它确实有效。非常感谢!我试图投票,但它说我需要 15 个声望点。另外我如何接受这个作为答案?以上是关于在 SQL 中不进行聚合的数据透视的主要内容,如果未能解决你的问题,请参考以下文章
在数据透视聚合函数中使用CONCAT函数的SQL Server错误