Sql Oracle中带聚合的旋转/透视表
我想在Oracle11g中旋转一个表。pivot选项需要聚合。 这是我的原始表格: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'
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保证。甚至没有提到“采矿”。它可能用于商业智能和数据挖掘,但不用于实际的数据挖掘。这是一种“电子表格”类型的操作,业务用户往往能很好地理解。