SQL:使用行值作为列标题

时间:2015-01-28 18:33:34

标签: sql oracle toad

我正在为客户端构建一个相当大的表,他们希望以某种方式表示数据。我的表目前是这样的:

DATE_RECEIVED | NAME  |      DOB    | ANALYTE | RESULT
  'YYYY/MM'   |STRING |'MM/DD/YYYY' | String  | String
   2011/03    |Name, A| 07/31/1056  |  AAAA   | Positive
   2011/03    |Name, A| 07/31/1056  |  BBBB   | Negative

我需要做的是像一个支点 - 每个“分析者”都是它自己的列,“结果”是列中的值,如下所示:

DATE_RECEIVED | NAME  |     DOB     |   AAAA   |   BBBB   |
   2011/03    |Name, A| 07/31/1056  | Positive | Negative | 

我用PIVOT尝试过一些东西,但我认为我仍然太新手无法理解该函数的逻辑是如何工作的。要么,或者我正在使用的SQL版本不支持透视。在这个网站上查看类似的问题并没有让我更接近解决这个问题,因为我真的不觉得我理解我的问题,知道我需要做些什么来解决它。无论如何,我完全被难倒了。如果有人能给我一个开始的地方,那将是非常有帮助的。谢谢!

...另外,我知道我正在使用Oracle SQL,但我不知道是什么版本。如果有帮助,我会在TOAD for Oracle 12.6版本中编写所有内容。

1 个答案:

答案 0 :(得分:0)

如果你不能使用PIVOT(也许你的Oracle版本不支持它),那么可以使用CASE代替聚合:

SELECT date_received, name, dob
     , MAX(CASE WHEN analyte = 'AAAA' THEN result END) AS aaaa
     , MAX(CASE WHEN analyte = 'BBBB' THEN result END) AS bbbb
  FROM mytable
 GROUP BY date_received, name, dob

更新:以下是您使用PIVOT完成相同操作的方法:

SELECT * FROM (
  SELECT date_received, name, dob, analyte, result
    FROM mytable
) PIVOT ( MAX(result) FOR (analyte) IN ('AAAA' AS a,'BBBB' AS b) );

SQL Fiddle Demo here.

请注意,使用PIVOT仍然需要汇总功能 - MAX()将在此处执行,如果只有一个值,MIN也会这样做! AS子句中的PIVOT命名结果列。

PIVOT的另一个问题是必须明确命名可能的值。您可以使用XML(read more about how to do that)来解决这个问题,但随后您的所有结果都将被XML化。