Sql Oracle中带聚合的旋转/透视表

Sql Oracle中带聚合的旋转/透视表,sql,oracle,pivot,pivot-table,Sql,Oracle,Pivot,Pivot Table,我想在Oracle11g中旋转一个表。pivot选项需要聚合。 这是我的原始表格: project | attribute | value =========================== 'cust1' | 'foo' | '4' 'cust2' | 'bar' | 'tbd' 'cust3 | 'baz' | '2012-06-07' 'cust1' | 'bar' | 'tdsa' 'cust4' | 'foo' | '22' 'cust4'

我想在Oracle11g中旋转一个表。pivot选项需要聚合。 这是我的原始表格:

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'
现在,如您所见,分组应该发生在项目列上。无需折叠或计算任何值。仅仅轮换是必要的。
那么,轴心选择是正确的吗?

是的,我想是的。使用
MAX
aggregate可以轻松完成这样的枢轴:

SELECT
    *
FROM
(
    SELECT
        project,
        attribute,
        value
    FROM
        table1
) AS SourceTable
PIVOT
(
    MAX(value)
    FOR attribute IN ([foo],[bar],[baz])
) AS pvt
否则,您必须在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
几乎相同。但是当MAX时,我更喜欢做
透视
而不是
情况。

MAX
在这里应该如何工作?如您所见,值的类型为
VARCHAR
——如果您有相同项目的重复项,例如
foo
,并且具有不同的值,则需要取其中一个。您也可以使用
min
。它将采用varchar值上的
max
。(项目,属性)对是唯一的。因此不会发生数据丢失。我在一个记录超过100000条的表上对此进行了评估。您可以根据需要进行查询。谢谢你为什么给这个贴标签?我在这里没有看到数据挖掘问题,也没有涉及统计数据。我假设pivot主要用于数据挖掘。一点也没有。数据挖掘是一种统计方法,主要在SQL数据库之外进行,因为它是一种只读分析,不需要任何ACID保证。甚至没有提到“采矿”。它可能用于商业智能和数据挖掘,但不用于实际的数据挖掘。这是一种“电子表格”类型的操作,业务用户往往能很好地理解。