SQL:使用行值作为列标题

SQL:使用行值作为列标题,sql,oracle,toad,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 | BBB

我正在为客户构建一个相当大的表,他们希望数据以某种方式表示。我的表当前如下所示:

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 | 
我需要做的是类似于枢轴的事情——每个“分析物”都是它自己的列,“结果”是列中的值,如下所示:

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,但我不知道是哪个版本。如果有帮助的话,我正在为Oracle 12.6版编写TOAD中的所有内容。

如果您不能使用
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) );

请注意,使用
PIVOT
时,您仍然需要一个聚合函数-
MAX()
将在此处执行,如果只有一个值,
MIN
也将执行此操作<
PIVOT
子句中的code>AS
为结果列命名


PIVOT的另一件事是可能的值必须显式命名。您可以通过使用XML()来解决这个问题,但这样所有结果都将被XML化。

Pivot需要11g;您可以使用
检查您的版本,从产品\u组件\u版本中选择版本,其中的产品类似于“Oracle数据库%”
。(可能有更简单的方法来检查…)。
分析物
值是一个有限集,还是可以设置为任何值?有许多可能的分析物值,我不知道它们的全部。版本为11.2.0.3.0是否涉及唯一约束?i、 例如,对于每个接收日期+姓名+DOB,只有一个分析物为AAA的记录?因为如果不是,那么您需要定义如何处理同一分析物和其他关键成分的多行。每个分析物每个名称/日期只有一个结果。此外,每个名称/日期可能有一些或所有分析物和结果。例如,Name_A可能有分析物AAA和BBB的结果,Name_B可能有AAA和CCC的结果,Name_C可能有AAA、BBB和CCC结果。您可以编写两个函数,一个用于回复AAAA状态,一个用于回复BBB状态,这两个函数都输入该表的主键。如果您随后使用Group By进行选择,您可以在虚拟列“AAAA”和“BBBB”中调用这些函数,这非常有效,但我仍然希望找到一种方法,不需要单独列出每个分析物。我认为
PIVOT
将是您唯一的选择,除非您也熟悉动态SQL。