Oracle11g,多个Pivots

时间:2014-05-20 19:03:02

标签: sql oracle oracle11g

所以我有一个可以为我调整一些数据的工作查询。

SELECT * FROM (
  select requisitions.ACC_ID AS "Accession #"
  ,tests.TEST_ID
  ,results.RESULT_NUMERIC
FROM requisitions

inner join req_panels ON requisitions.acc_id = req_panels.acc_id
inner join results ON req_panels.rp_id = results.rp_id
inner join tests ON results.test_id = tests.test_id

WHERE results.TEST_ID IN (1,2,3,4)
AND requisitions.RECEIVED_DATE > TO_DATE('9/1/2013', 'MM/DD/YYYY')
ORDER BY requisitions.ACC_ID
)
pivot(
      MAX(RESULT_NUMERIC)
      for TEST_ID IN ('1' AS Test1,'2' AS Test2,'3' AS Test3,'4' AS Test4)
)

现在,我必须在每个ACC_ID中包含不同类型的结果(结果表中的RESULTS_ALPHA)作为列。 RESULT_ALPHA是一个clob。对于上面代码中已包含的test_id,RESULTS_ALPHA为空。但它对另一个测试有价值,我们称之为#34; TestAlpha"。

所以我目前从上面的代码输出的是

Acc_ID | Test 1 | Test 2 | Test 3 | Test 4
-------------------------------------------
000001 |   24   |   1.5  |   0.5  |  2.1
000002 |   15   |   2.1  |   0.3  |  1.3

我需要得到

Acc_ID | Test 1 | Test 2 | Test 3 | Test 4 | TestAlpha
--------------------------------------------------------
000001 |   24   |   1.5  |   0.5  |  2.1   |  abcd
000002 |   15   |   2.1  |   0.3  |  1.3   |  efgh

我怎样才能做到这一点?另一个支点? 感谢。

1 个答案:

答案 0 :(得分:0)

如果你只能使用CLOB字段的前4000个字符,那么你可以只对它进行子串:

SELECT * FROM (
  select requisitions.ACC_ID AS "Accession #"
  ,tests.TEST_ID
  ,results.RESULT_NUMERIC
  ,dbms_lob.substr(results.RESULT_ALPHA, 4000, 1) as result_alpha
FROM requisitions
...

当然,在输出中为您提供了一个4000字符宽的列,但是您可以做的不多,除非您可以根据列中的内容知识设置较低的长度。 (虽然如果它低于4K,将它存储为CLOB并不是真的有意义;但听起来你在那里混合了数据。)

即使该值超过4000个字符,也会显示该字符的开头。这是否可接受或有用,取决于您对枢轴结果所做的事情。

您正在做的事情似乎假设RESULTS_ALPHA对于每个results的所有TEST_ID记录都相同;甚至每个ACC_ID。如果这是真的,那似乎有点浪费。

我不确定是否有非程序化解决方案可以恢复完整的CLOB。