2009-06-08 3 views
0

Использование SQL Server (2005/2008)SQL partiton путем Подавить повторяющихся значений

есть простой способ подавить повторяющиеся суб & общие итоги?

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
from hdr h, cust c WHERE h.custno = c.custno and h.hdate = '6/8/2009'

в основном подавляют (или нуль), за исключением последней позиции, до изменения группы

Спасибо !!

ответ

0

Nest это подзапрос и добавьте свой фильтр в WHERE:

SELECT * 
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 
from hdr h, cust c WHERE h.custno = c.custno and h.hdate = '6/8/2009' 
) AS X 
WHERE whatever 
1

Какую базу данных это? В 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 
+0

ОК, это делает работу, но, помимо лишнего мусора, кажется ... есть ли в принципе лучший способ сделать это? –

+0

(с использованием чистого sql), а не кубов, служб отчетов и т. Д. –

+0

Вы можете удалить два поля count (*), сделав порядок сортировки row_number() в обратном порядке вашего окончательного порядка сортировки, а затем используя вместо = 1 вместо of no = count. Он делает больше работы для базы данных, хотя (в два раза больше сортировки). –

Смежные вопросы