我试图将行转换为列,但我目前的做法非常无效。我想找到一种方法来做到这一点,并不要求我把所有东西变成子查询。这就是我目前正在使用的内容:
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种不同的要求,我需要为每一个写一个子查询。有没有办法只是转动它们,这样它可以更有活力?
答案 0 :(得分:1)
您需要JOIN
和CASE
。
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或更高版本中使用。