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
我想弄清楚如何在不聚合的情况下将列转换为行。
我有一个 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