我有一个问题就像非聚合数据透视图,但我希望我的表包含多个结果。作为一个例子,我开始这样:
ID | OrganizationID | Group | Vendor | Product
1 3 G1 V1 P1
2 3 G1 V2 P2
3 3 G2 V3 P3
4 4 G1 V1 P1
5 4 G1 V1 P2
并且需要我的数据最终结果如下:
ID | OrganizationID | G1_V1 | G1_V2 | G2_V3
1 3 P1 P2 P3
2 4 P1 NULL NULL
3 4 P2 NULL NULL
我正在使用的数据大约有700万行,因此使用动态sql自我加入已经证明非常慢。有什么容易让我失踪吗?提前谢谢!
答案 0 :(得分:3)
您可以使用公用表表达式和一组CASE
语句来获取所需的数据透视结构;这在大多数RDBMS中都会完全相同。
WITH cte AS (
SELECT id, organizationid,
CONCAT([Group],'_',Vendor) col,
product,
ROW_NUMBER() OVER (
PARTITION BY organizationid,[group],vendor
ORDER BY product) rn
FROM myTable
)
SELECT
organizationid,
MAX(CASE WHEN col='G1_V1' THEN product ELSE NULL END) G1_V1,
MAX(CASE WHEN col='G1_V2' THEN product ELSE NULL END) G1_V2,
MAX(CASE WHEN col='G2_V3' THEN product ELSE NULL END) G2_V3
FROM cte
GROUP BY organizationid, rn;
......或者,您可以使用TSQL的常规PIVOT语句来替换CASE
部分,这可能会更快,但可能无法在所有RDBMS中使用;
WITH cte AS (
SELECT id, organizationid,
CONCAT([Group],'_',Vendor) col,
product,
ROW_NUMBER() OVER (
PARTITION BY organizationid,[group],vendor
ORDER BY product) rn
FROM myTable
)
SELECT organizationid as organizationid,
[G1_V1], [G1_V2], [G2_V3]
FROM
(SELECT organizationid,rn,col, product FROM cte) AS SourceTable
PIVOT
(
MAX(product) FOR col IN ([G1_V1], [G1_V2], [G2_V3])
) AS PivotTable;
您可以使用crosstab在PostgreSQL中生成类似的数据透视表,但是我没有安装了tablefunc模块的PostgreSQL数据库进行测试,因此只能链接到详细信息。