在 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 中不进行聚合的数据透视的主要内容,如果未能解决你的问题,请参考以下文章

T-SQL:没有聚合的数据透视表

具有多列聚合的 SQL Server 数据透视表

在数据透视聚合函数中使用CONCAT函数的SQL Server错误

没有聚合函数的 SQL Server 数据透视查询

如何在 oracle 数据库中为具有复杂聚合的数据透视编写等效的 sql 查询?

Postgresql 如何在 SQL 数据库上透视表