Informix SQL SELECT многострочный результат - как представить в один ряд? - PullRequest
0 голосов
/ 02 февраля 2020

Следующий запрос:

select s.site_name as site, NVL(ct.calltypename,"<No queue assigned>") as queue,
  AVG(TO_NUMBER(cd.datavalue)) as average, count(distinct cr.callid) as count
from callrecord cr 
left join calldata cd on cd.callid=cr.callid and cd.sitekey=cr.arrivalsite and cr.requeuecount=cd.requeuecount-1 
left join calltypes ct on cr.arrivalsite=ct.sitekey and cr.calltypekey=ct.calltypekey
left join sites s on cr.arrivalsite=s.sitekey
where cd.datakey="key1"
group by site, queue

дает следующий результат:

  site  queue                   average    count
  MSK     <No queue assigned>   3.00       4
  MSK     Sales                 2.00       1                
  MSK     Service               3.63       32 

В результате может быть до 6 строк. Задача - переформатировать вывод для приложения, использующего SQL для извлечения данных. Это приложение может отправлять только одну команду SQL и может обрабатывать только одну строку. Поэтому результат SQL должен выглядеть следующим образом:

  site1   queue1   average1   count1   site2   queue2   average2  count2 ...
  MSK     Sales    2.00       1        MSK     Service  3.63      32

Также важно, чтобы каждая очередь всегда отображалась в тот же столбец; если данных нет, столбец должен быть пустым, нулевым или нулевым. Я нашел несколько примеров для MS SQL, но они не работают в Informix.

1 Ответ

2 голосов
/ 02 февраля 2020

Я думаю, вы можете использовать оконные функции и условное агрегирование:

with t as (
      < your query here >
     )
select max(case when seqnum = 1 then site end) as site_1,
       max(case when seqnum = 1 then queue end) as queue_1,
       max(case when seqnum = 1 then average end) as average_1,
       . . . 
       max(case when seqnum = 6 then site end) as site_6,
       max(case when seqnum = 6 then queue end) as queue_6,
       max(case when seqnum = 6 then average end) as average_6,
from (select t.*,
             row_number() over (partition by site order by queue) as seqnum
      from t
     ) t;
...