2013-12-10 2 views
1

У меня есть большой запрос SQL, который соединяет столбцы из нескольких таблиц, чтобы дать данные в этом формате:Преобразование нескольких строк в 1 колонку без поворота в оракуле

ID CODE Count Action 
----------------------------- 
1 A  02  VIEWED 
1 A  22  CLICKED 
1 A  45  PRINTED 
1 A  32  SCHEDULED 
2 A  34  VIEWED 
2 B  14  CLICKED 
2 B  23  PRINTED 
2 B  78  SCHEDULED 
. 
. 
X D  12  CLICKED 

Значение действия может быть только просмотрено, щелкнули, ЗАПЛАНИРОВАН, ПЕЧАТИ. Каждая комбинация ID, CODE имеет максимум 4 строки. Если нет количества действий говорят, что «Clicked», строка для этого нет

Поэтому, как только у меня есть набор результатов, я хочу, чтобы сгладить это, чтобы иметь данные в этом формате:

Id CODE VIEWED CLICKED PRINTED SCHEDULED 
----------------------------------------------- 
1 A  02   11  45  32 
1 B  54   57  89  45 
2 B  34   14  23  78 
3 G  null  null  28  20 
X D  null  12  null null 

мой запрос делает много вещей, но в общем он делает:

SELECT ID,CODE, ACTION, COUNT(*) AS COUNT 
FROM MY_TABLE 
GROUP BY ID,CODE,ACTION. 

в одном запросе я хочу, чтобы получить набор результатов, а затем расплющить строки. Я не могу использовать union-alls и т. Д., Чтобы запросить БД несколько раз.

База данных Oracle 9i, поэтому функция поворота не будет работать.

ответ

1

должны быть в состоянии использовать SUM с CASE, удалением ACTION из вашего GROUP BY пункта:

SELECT ID, 
    CODE, 
    SUM(CASE WHEN ACTION = 'VIEWED' THEN 1 ELSE 0 END) Viewed, 
    SUM(CASE WHEN ACTION = 'CLICKED' THEN 1 ELSE 0 END) Clicked, 
    SUM(CASE WHEN ACTION = 'PRINTED' THEN 1 ELSE 0 END) Printed, 
    SUM(CASE WHEN ACTION = 'SCHEDULED' THEN 1 ELSE 0 END) Scheduled 
FROM MY_TABLE 
GROUP BY ID, 
    CODE 
+0

Вам нужно подвести поле 'count' вместо добавления 1. Как,' случай, когда ACTION = «ПРОСМОТРЕТЬ» ТОГДА счет ELSE 0 END' – Dba

+0

@Dba - не был полностью уверен в этом вопросе. OP упоминает 'COUNT (*)' создает поле 'Count'. Использование 'SUM' с' CASE', как это, должно дать тот же результат, но только суммирование, где сопоставление в поле «Действие». С уважением. – sgeddes

+0

Да, вы правы, это было очень ясно из вопроса. Спасибо за разъяснения. – Dba

0
select id,code,decode(action,'VIEWED',count,'null') viewed, 
       decode(action,'CLICKED',count,'null') Clicked, 
       decode(action,'PRINTED',count,'null') Printed, 
       decode(action,'SCHEDULED',count,'null') Scheduled from you_table groub by ID,CODE; 
Смежные вопросы