2012-06-07 35 views
2

我想旋转Oracle 11g中的表格。枢轴选项需要聚合。 这是我原来的表:在Oracle中使用聚合的旋转/数据透视表

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' 

现在,你可以看到,分组应该发生在项目列。没有值需要折叠或计算。单纯的旋转是必要的。 那么,枢轴选择正确的事情呢?

+0

你为什么要标记这个[tag:data-mining]?我看到这里没有数据挖掘问题,没有涉及统计数据。 –

+0

我推测主要用于数据挖掘。 –

+2

根本不是。数据挖掘是统计学,大部分都是在SQL数据库之外完成的,因为它是只读分析,不需要任何ACID保证。 https://en.wikipedia.org/wiki/Pivot_table甚至没有提及“采矿”。它可能用于商业智能和*数据挖掘*,但不适用于实际的数据挖掘。这是企业用户倾向于理解的“电子表格”类型的操作。 –

回答

5

是的,我认为是。这是很容易做到这样的支点与MAX骨料:

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

否则,你必须做一个最大集合内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几乎是一回事。但我宁愿在CASE WHEN MAX上做PIVOT ..

+0

'MAX'应该如何在这里工作?正如你所看到的,值的类型为'VARCHAR'- –

+0

如果你在同一个项目中有重复的例子'foo',并且值不同,那么你需要取其中一个。你也可以使用'min'。它将采用varchar值的“max”。 – Arion

+0

(项目,属性)对是唯一的。所以不会发生数据丢失。我已经在具有> 100 000条记录的表格上对此进行了评估。您可以根据需要查询作品。谢谢! –