Informix SQL SELECT 多行结果 - 如何显示在一行中?
Informix SQL SELECT multi-row result - how to present in one row?
以下请求:
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
同样重要的是每个队列应该始终出现在同一列中;如果没有数据,列应为空、null 或零。我找到了一些适用于 MS SQL 的示例,但它们在 Informix 中不起作用。
我认为你可以使用 window 函数和条件聚合:
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;
以下请求:
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
同样重要的是每个队列应该始终出现在同一列中;如果没有数据,列应为空、null 或零。我找到了一些适用于 MS SQL 的示例,但它们在 Informix 中不起作用。
我认为你可以使用 window 函数和条件聚合:
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;