我正在为客户端构建一个相当大的表,他们希望以某种方式表示数据。我的表目前是这样的:
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版本中编写所有内容。
答案 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) );
请注意,使用PIVOT
仍然需要汇总功能 - MAX()
将在此处执行,如果只有一个值,MIN
也会这样做! AS
子句中的PIVOT
命名结果列。
PIVOT
的另一个问题是必须明确命名可能的值。您可以使用XML(read more about how to do that)来解决这个问题,但随后您的所有结果都将被XML化。