2014-06-19 4 views
0

Ceci est ma requête initiale:Comment faire pour SUM une instruction case contenant une instruction select imbriquée?

select 
CASE WHEN a.TO_WG_ID is null 
and a.CREATED_DATE_TIME = 
(select min(b.created_date_time) from ymtn.message b 
where b.thread_id = a.thread_id) THEN 1 ELSE 0 
END AS "Created" 
from ymtn.MESSAGE a 
left join YMTN.WORKGROUP b 
ON a.FROM_WG_ID=b.WORKGROUP_ID 
where b.WORKGROUP_ID='1STOP_PROCESS' 

Il me donne une colonne avec un groupe de 1' et 0. Tout ce que je veux sortir est la somme .. juste un nombre par exemple. 1691. Si je place un SUM devant l'instruction case, j'obtiens cette erreur: Msg 130, niveau 15, état 1, ligne 5 Impossible d'exécuter une fonction d'agrégation sur une expression contenant un agrégat ou une sous-requête. Alors, comment je fais ça? Je l'ai fait travailler avec cette requête:

select count(CREATED_DATE_TIME) as 'Created' 
from ymtn.MESSAGE a 
LEFT JOIN YMTN.WORKGROUP b 
ON a.FROM_WG_ID=b.WORKGROUP_ID 
where CREATED_DATE_TIME=(SELECT MIN(b.CREATED_DATE_TIME) FROM YMTN.MESSAGE b WHERE 
b.THREAD_ID = a.THREAD_ID) 
and a.TO_WG_ID is null 
and b.WORKGROUP_ID='1STOP_PROCESS' 

Cependant, je le veux travailler dans la déclaration des cas et ne pas avoir à déplacer le imbriquée sélectionner vers le bas à la clause WHERE.

Répondre

1

Vous pourriez jeter le tout dans une sous-requête et faire la somme?

select sum(Created) 
from (
    select 
    CASE WHEN a.TO_WG_ID is null 
    and a.CREATED_DATE_TIME = 
    (select min(b.created_date_time) from ymtn.message b 
    where b.thread_id = a.thread_id) THEN 1 ELSE 0 
    END AS "Created" 
    from ymtn.MESSAGE a 
    left join YMTN.WORKGROUP b 
    ON a.FROM_WG_ID=b.WORKGROUP_ID 
    where b.WORKGROUP_ID='1STOP_PROCESS' 
) a 
+0

Cela fonctionne. Merci pour cette solution. –

Questions connexes