【问题标题】:Flatten a SQL Table from rows to columns allowing multiple results将 SQL 表从行展平到列,从而允许多个结果
【发布时间】:2014-03-17 16:42:45
【问题描述】:

我有一个类似于非聚合数据透视表的问题,但我希望我的表格包含多个结果。作为一个例子,我是这样开始的:

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 进行自联接已被证明非常缓慢。有什么容易我想念的吗?提前致谢!

【问题讨论】:

  • 您是否需要多个固定列,或者您正在寻找动态解决方案?后者可能不适用于某些 RDBMS。
  • 我目前正在考虑将 SQL Server 2012 和 Postgres 9.3 作为潜在的解决方案。我有固定数量的列,虽然它类似于 673,所以我使用动态 sql 将列表放在一起。

标签: sql sql-server-2012 pivot crosstab postgresql-9.3


【解决方案1】:

您可以使用一个公用表表达式和一组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;

An SQLfiddle to test both.

您可以使用crosstab 在 PostgreSQL 中生成类似的数据透视表,但是我没有安装 tablefunc 模块的 PostgreSQL 数据库进行测试,因此只能链接到详细信息。

【讨论】:

  • @CraigRinger 你能添加一个样本吗?尝试了一些基本的示例代码,我不能load the extension,它似乎不是loaded by default
  • 我刚查了一下,我错了,sqlfiddle中安装了很多扩展,但是tablefunc似乎不是其中之一。
  • Sqlfiddle 回答中的链接可能已经失效,或者可能只是他们网站上的一个问题。
猜你喜欢
  • 2014-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-25
  • 2020-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多