2014-12-30 2 views
0

У меня есть таблица (MyTable) с этими столбцами: точкой сигнализации load_id countAlarms ...Oracle SQL присоединиться к той же таблице

и я использую этот запрос:

select point, decode(alarm,0,'new','rec') NewRec, sum (countAlarms) total_alarms, load_id from MyTable 
where 1=1 
--and load_id = (select max(load_id) from MyTable) -0 
group by point, decode(alarm,0,'new','rec'), load_id 
order by 1, 2 
) 

к получите что-то вроде этого:

point1 new 1200 111113 
point1 rec 6000 111113 
point2 new 1220 111113 
point2 rec 3000 111113 
point3 new 3220 111113 
point3 rec 1000 111113 
point1 new 1300 111112 
point1 rec 6300 111112 
point3 new 1220 111112 
point3 rec 1100 111112 
point1 new 1300 111111 
point1 rec 6300 111111 
point2 new 1120 111111 
point2 rec 3100 111111 
point3 new 1220 111111 
point3 rec 1100 111111 
.... 

что мне нужно:

point newRec  point point point 
--------------------------------------- 
point1 new   1200 1300 1300 
point1 rec   6000 6300 6300 
point2 new   1220   1120 
point2 rec   3000   3100 
point3 new   3220 1220 1220 
point3 rec   1000 1100 1100 

Я попытался с полным внешним соединением, но он не работает :(

+0

Использовать Self присоединяется ... –

ответ

1

Похоже, что вы хотите pivot свой результирующий набор, а не присоединиться к нему самому себе. Предполагая, что вы находитесь на Oracle 11g или выше, вы можете сделать это изначально:

select * from (
    select point, decode(alarm,0,'new','rec') NewRec, countAlarms, load_id 
    from MyTable 
) 
pivot (
    sum(countAlarms) as alarms 
    for (load_id) in (111113 as a, 111112 as b, 111111 as c) 
) 
order by 1, 2; 

Какие данные выборки, соответствующие заданной выходной выше, дает:

POINT NEWREC A_ALARMS B_ALARMS C_ALARMS 
------ ------ ---------- ---------- ---------- 
point1 new   1200  1300  1300 
point1 rec   6000  6300  6300 
point2 new   1220     1120 
point2 rec   3000     3100 
point3 new   3220  1220  1220 
point3 rec   1000  1100  1100 

SQL Fiddle demo.

Вы должны знать значения, которые вы поворачиваете; неясно, знаете ли вы идентификаторы загрузки заранее, но фильтр идентификатора загрузки с комментариями в исходном запросе предполагает, что вы не можете. Если вам всегда нужны три (или любое фиксированное число) наивысших идентификаторов загрузки, то это может быть достигнуто путем изменения внутреннего запроса и опорных критериев, например. с аналитическим dense_rank() псевдо-колонки:

select * from (
    select point, decode(alarm,0,'new','rec') NewRec, countAlarms, 
    dense_rank() over (partition by null order by load_id desc) as rnk 
    from MyTable 
) 
pivot (
    sum(countAlarms) as alarms 
    for (rnk) in (1 as a, 2 as b, 3 as c) 
) 
order by 1, 2; 

SQL Fiddle.

+0

Alex, просто для удовольствия :-), не предназначен для каламбура http://meta.stackexchange.com/questions/246331/main-page-still-shows-the-name-of- last-poster-even-after-he-deletes-his-post –

+0

Haha ... lol :-) Извините, что опубликовать здесь комментарий, я хочу, чтобы SO предлагала личную почту. –

+0

WOOOWWW Мне нужно это узнать! но отлично! Большое спасибо. – UserRaspberry