2009-06-08 7 views
0

Utilisation de SQL Server (2005/2008)sql partiton par Suppress répéter les valeurs

est-il un moyen facile de supprimer les grands totaux sous & répéter?

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'

suppriment essentiellement (ou nul) à l'exception de la dernière position, avant le changement de groupe

Merci !!

Répondre

0

Nest cela dans un sous-requête et ajoutez votre filtre dans un 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

Qu'est-ce que la base de données est ce? Sur SQL Server, quelque chose comme ceci ferait:

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 

version écourtée, plus de tri pour la base de données, peut-être moins évident ce qui se passe:

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 

Alternativement, en utilisant ROLLUP pour générer des lignes de sous-totaux et le total :

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 

pour obtenir les résultats dans le bon ordre, changer l'ordre par quelque chose comme ceci:

order by 
    grouping(h.salesmanno) 
    , h.salesmanno 
    , grouping(c.custname) 
    , c.custname 
+0

ok, cela fait le travail, mais beaucoup de jonque supplémentaire il semble ... y at-il une façon fondamentalement meilleure de faire cela? –

+0

(en utilisant sql pur), pas les cubes, les services de reporting etc ... –

+0

Vous pouvez supprimer les deux champs count (*) en faisant en sorte que row_number() trie l'ordre inverse de votre ordre de tri final, puis en utilisant no = 1 de non = compte. Cela fait cependant plus de travail pour la base de données (deux fois plus de tri). –

Questions connexes