在 Oracle 中使用聚合旋转/透视表

本教程将介绍在 Oracle 中使用聚合旋转/透视表的处理方法,这篇教程是从别的地方看到的,然后加了一些国外程序员的疑问与解答,希望能对你有所帮助,好了,下面开始学习吧。

在 Oracle 中使用聚合旋转/透视表 教程 第1张

问题描述

我想在 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'

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

推荐答案

是的,我想是的.使用 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..

好了关于在 Oracle 中使用聚合旋转/透视表的教程就到这里就结束了,希望趣模板源码网找到的这篇技术文章能帮助到大家,更多技术教程可以在站内搜索。