【问题标题】:Rotate/pivot table with aggregation in Oracle在 Oracle 中使用聚合旋转/透视表
【发布时间】:2012-06-07 09:26:21
【问题描述】:

我想在 Oracle 11g 中旋转一个表。枢轴选项需要聚合。 这是我的原始表格:

project | attribute | value
===========================
'cust1' | 'foo'     | '4'
'cust2' | 'bar'     | 'tbd'
'cust3  | 'baz'     | '2012-06-07'
'cust1' | 'bar'     | 'tdsa'
'cust4' | 'foo'     | '22'
'cust4' | 'baz'     | '2013-01-01'

旋转后,表格应如下所示:

project | foo | bar | baz
=========================
'cust1' | '4' |'tdba'| NULL
'cust2' | NULL|'tbd' | NULL
'cust3' | NULL| NULL | '2012-06-07'
'cust4' | '22'| NULL | '2013-01-01'

现在,如您所见,分组应该发生在项目列上。不需要折叠或计算任何值。只需轮换一次。 那么,枢轴选择是否正确?

【问题讨论】:

  • 你为什么要标记这个data-mining?我在这里没有看到任何数据挖掘问题,也没有涉及统计数据。
  • 我认为 pivot 主要用于数据挖掘。
  • 一点也不。数据挖掘是统计数据,并且大多在 SQL 数据库之外完成,因为它是一种只读分析,不需要任何 ACID 保证。 en.wikipedia.org/wiki/Pivot_table 甚至没有提到“挖矿”。它可能用于商业智能和数据钻探,但未用于实际数据挖掘。它是一种业务用户容易理解的“电子表格”类型的操作。

标签: sql oracle pivot pivot-table


【解决方案1】:

是的,我想是的。使用MAX 聚合很容易进行这样的数据透视:

SELECT
    *
FROM
(
    SELECT
        project,
        attribute,
        value
    FROM
        table1
) AS SourceTable
PIVOT
(
    MAX(value)
    FOR attribute IN ([foo],[bar],[baz])
) AS pvt

否则,您必须在 a max 聚合中执行 case 语句。像这样:

SELECT
    MAX(CASE WHEN attribute='foo' THEN value ELSE NULL END) AS foo,
    MAX(CASE WHEN attribute='bar' THEN value ELSE NULL END) AS bar,
    MAX(CASE WHEN attribute='baz' THEN value ELSE NULL END) AS baz,
    project
FROM
    table1
GROUP BY
    project

这与PIVOT 几乎相同。但我更喜欢PIVOT 而不是CASE WHEN MAX..

【讨论】:

  • MAX 应该如何在这里工作?如您所见,值的类型为VARCHAR-
  • 如果您有相同项目的重复项,例如 foo,并且具有不同的值,那么您需要选择其中一个。你也可以使用min。它将在 varchar 值上使用 max
  • (项目,属性)对是唯一的。所以不会发生数据丢失。我已经在具有 > 100 000 条记录的表上对此进行了评估。您可以根据需要查询。谢谢!
猜你喜欢
  • 1970-01-01
  • 2021-07-27
  • 1970-01-01
  • 1970-01-01
  • 2019-02-10
  • 2015-09-23
  • 2018-11-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多