2010-11-04 12 views
1

Je cherche une amélioration à la requête ci-dessous, toute entrée avec reconnaissance reçuOptimisation SQL, requête existante en utilisant deux scans tableau complet CTE

with cteA as (
     select name, count(1) as "A" 
     from mytable 
     where y="A" 
     group by name 
    ), 
    cteB as (
      select name, count(1) as "B" 
      from mytable 
      where y="B" 
      group by name 

    ) 
    SELECT cteA.name as 'name', 
     cteA.A as 'count x when A', 
     isnull(cteB.B as 'count x when B',0) 
    FROM 
    cteOne 
    LEFT OUTER JOIN 
    cteTwo 
    on cteA.Name = cteB.Name 
    order by 1 

Répondre

3
select name, 
     sum(case when y='A' then 1 else 0 end) as [count x when A], 
     sum(case when y='B' then 1 else 0 end) as [count x when B] 
    from mytable 
    where y in ('A','B') 
    group by name 
    order by name 
+0

+1 - Nice! (15chars) – JNK

+0

Bien sûr, il serait également utile si les champs Y et le nom sont indexés. – HLGEM

0

La réponse la plus simple est:

select name, y, count(*) 
from mytable 
where y in ('A','B') 
group by name, y 

Vous pouvez utiliser un PIVOT pour déplacer des valeurs de ligne Y dans des colonnes, si vous en avez besoin dans des colonnes.