Oracle查询将行转换为列

时间:2017-12-15 07:29:06

标签: sql oracle

我试图将行转换为列,但我目前的做法非常无效。我想找到一种方法来做到这一点,并不要求我把所有东西变成子查询。这就是我目前正在使用的内容:

select h.request_id, h.SAMPLES_DATE, h.SAMPLES_TIME, h.parent_area_name, h.area_name, h.point_name, h.oblastname,
unistr((select r.measured_result from lab_requests_requrements r where r.request_id=h.request_id and r.requirement_id = 51)) wr51,
unistr((select r.measured_result from lab_requests_requrements r where r.request_id=h.request_id and r.requirement_id = 131)) wr131,
unistr((select r.measured_result from lab_requests_requrements r where r.request_id=h.request_id and r.requirement_id = 143)) wr143
from lab_requests_head_view h
where h.water_type_id = 3 and h.water_type = 2
order by h.request_number

我有超过300种不同的要求,我需要为每一个写一个子查询。有没有办法只是转动它们,这样它可以更有活力?

2 个答案:

答案 0 :(得分:1)

您需要JOINCASE

SELECT h.request_id,
         h.SAMPLES_DATE,
         h.SAMPLES_TIME,
         h.parent_area_name,
         h.area_name,
         h.point_name,
         h.oblastname,
         UNISTR (CASE WHEN r.request_id = 51 THEN r.request_id END) wr51,
         UNISTR (CASE WHEN r.request_id = 131 THEN r.request_id END) wr131,
         UNISTR (CASE WHEN r.request_id = 143 THEN r.request_id END) wr143
    FROM lab_requests_head_view h
         JOIN lab_requests_requrements r ON r.request_id = h.request_id
   WHERE h.water_type_id = 3 AND h.water_type = 2
ORDER BY h.request_number;

答案 1 :(得分:1)

  

有没有办法只是转动它们以使它更具动态性?

是的,您可以使用Oracle PIVOT。它允许缩短代码,但无论如何你需要描述所有300列。

select *
  from (select h.request_id, h.SAMPLES_DATE, h.SAMPLES_TIME, h.parent_area_name, 
               h.area_name, h.point_name, h.oblastname,r.requirement_id
          from lab_requests_head_view h
               left join lab_requests_requrements r on r.request_id = h.request_id
         where h.water_type_id = 3 and h.water_type = 2)
 pivot (max(r.measured_result) for requirement_id in (51, 131, 143))
 order by h.request_number

您必须在行requirement_id中写下所有想要的for requirement_id in (...)并选择一个聚合函数。我使用max,因为我不知道哪个最适合你。如果您在r.measured_result中有独特的结果,则应该没问题。

P上。 S. Pivot可在Oracle 11.1或更高版本中使用。