SQL 中没有聚合的数据透视

Pivot without aggregation in SQL

我想弄清楚如何在不聚合的情况下将列转换为行。

我有一个 table,其中包含帐户、公司名称和公司百分比。我正在尝试调整,以便与该帐户相关的所有公司信息都在同一行。一个帐户可以拥有多少家公司没有限制,我需要包括所有公司。

目前:

账户 公司名称 公司%
1 公司A 公司A%
1 B公司 B公司%
2 B公司 B公司%
3 公司A 公司A%
3 B公司 B公司%
3 K公司 公司K%
3 W公司 公司W%

预期结果:

账户 公司 1 公司 1% 公司 2 公司 2% 公司 3 公司 3% 公司 4 公司 4%
1 公司A 公司A% B公司 B公司%
2 B公司 B公司%
3 公司A 公司A% B公司 B公司% K公司 公司K% W公司 公司W%

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