Какую базу данных это? В SQL Server, то, как это будет делать:
select
salesmanno, custname, amt
, case when subtotal_no = subtotal_count then subtotal end as subtotal
, case when total_no = total_count then subtotal end as total
from (
select
h.salesmanno
, c.custname
, h.amt
, sum(h.amt) over (partition by salesmanno) as subtotal
, sum(h.amt) over (partition by null) as grandtotal
, row_number() over (partition by salesmanno order by custname) as subtotal_no
, row_number() over (partition by null order by salesmanno, custname) as as total_no
, count(*) over (parition by salesmanno) as subtotal_count
, count(*) over (parition by null) as total_count
from hdr h, cust c
WHERE h.custno = c.custno
and h.hdate = '6/8/2009'
) a
order by total_no
укороченную версию, более сортировки для базы данных, может быть, менее очевидно, что происходит:
select
salesmanno, custname, amt
, case when subtotal_no = 1 then subtotal end as subtotal
, case when total_no = 1 then subtotal end as total
from (
select
h.salesmanno
, c.custname
, h.amt
, sum(h.amt) over (partition by salesmanno) as subtotal
, sum(h.amt) over (partition by null) as grandtotal
, row_number() over (partition by salesmanno order by custname desc) as subtotal_no
, row_number() over (partition by null order by salesmanno desc, custname desc) as as total_no
from hdr h, cust c
WHERE h.custno = c.custno
and h.hdate = '6/8/2009'
) a
order by total_no desc
В качестве альтернативы, с использованием ROLLUP для генерации промежуточных итогов и общих строк :
select
h.salesmanno
, c.custname
, sum(h.amt) as amt
from hdr h, cust c
WHERE h.custno = c.custno
and h.hdate = '6/8/2009'
group by
h.salesmanno
, c.custname
with rollup
order by
h.salesmanno
, c.custname
чтобы получить результаты в правильном порядке, изменить порядок, чтобы что-то вроде этого:
order by
grouping(h.salesmanno)
, h.salesmanno
, grouping(c.custname)
, c.custname
ОК, это делает работу, но, помимо лишнего мусора, кажется ... есть ли в принципе лучший способ сделать это? –
(с использованием чистого sql), а не кубов, служб отчетов и т. Д. –
Вы можете удалить два поля count (*), сделав порядок сортировки row_number() в обратном порядке вашего окончательного порядка сортировки, а затем используя вместо = 1 вместо of no = count. Он делает больше работы для базы данных, хотя (в два раза больше сортировки). –