Masquage d'une ligne où value = 0 mais count ses autres valeurs de colonne dans les calculs totaux – sql2008

J'ai des tables comme ça: (C1-C2 varchar (10), C3-Number int)

WaitingData C1 C2 C3 Number AB 1 10 AB 2 0 AB 3 4 XB 4 2 CompletedData C1 C2 C3 Number AB 1 5 AB 2 2 AB 3 0 XB 4 12 

J'utilise la requête ci-dessous pour représenter datatables:

 Select wd.C1,wd.C2,wd.C3,wd.Number as NW,cdd.Number as NC into #AllData from (Select C1,C2,C3,sum(Number) from WaitingData group by C1,C2,C3) wd outer apply (Select C1,C2,C3,sum(Number) from CompletedData cd where wd.C1=cd.C1 and wd.C2=cd.C2 and wd.C3=cd.C3 ) cdd Select * from #AllData union Select C1='Total',C2='Total',C3=-1, sum(NW),sum(NW) from #AllData 

Cela me donne une sortie comme:

 C1 C2 C3 NW NC AB 1 10 5 AB 2 0 2 AB 3 4 0 XB 4 2 12 Total Total -1 16 19 

Cependant, je veux cacher les lignes qui n'ont pas de NW mais calculer ses valeurs concernant le calcul de la ligne Total (voir NC ci-dessous). La sortie que je veux est comme:

 C1 C2 C3 NW NC AB 1 10 5 AB 3 4 0 XB 4 2 12 Total Total -1 16 19 

Je ne pouvais pas find un moyen de fournir une sortie comme celle-ci. Toute aide serait si appréciée!

——————————MODIFIER——————- ——————–

——————————MODIFIER——————- ——————–

Lorsque j'ai des données dans les arrays comme ci-dessous, l'application externe ne fonctionne pas comme je le souhaite, elle n'inclut pas datatables AB 2.

 WaitingData C1 C2 C3 Number AB 1 10 AB 3 4 XB 4 2 CompletedData C1 C2 C3 Number AB 1 5 AB 2 2 XB 4 12 

Et la sortie serait comme:

 C1 C2 C3 NW NC AB 1 10 5 AB 3 4 NULL XB 4 2 12 Total Total -1 16 17 

Dans cette situation, que puis-je faire pour countr "2" valeur NC ayant par AB 2 sur le résultat final et voir NC comme 19 au lieu de 17, sauf l'insertion de tous les loggings inclus par CompletedData mais WaitingData? (besoin d'un moyen efficace)

Enveloppez le résultat final avec une autre sélection et exclure les lignes où NW = 0.

 select * from ( Select * from #AllData union Select C1='Total',C2='Total',C3=-1, sum(NW),sum(NC) from #AllData ) t where NW <> 0 

Edit: utiliser une full join pour get toutes les valeurs des deux tables.

 with t as (select coalesce(w.c1,c.c1) as c1,coalesce(w.c2,c.c2) as c2,coalesce(w.c3,c.c3) as c3 , coalesce(w.number,0) as nw , coalesce(c.number,0) as nc from waitingdata w full join completeddata c on w.c1 = c.c1 and w.c2=c.c2 and w.c3=c.c3) select * from (select * from t union all Select C1='Total',C2='Total',C3=-1, sum(NW),sum(NC) from t) x where nw <> 0 

Vous pouvez faire tout cela dans une requête, sans tables temporaires, résultats intermédiaires, sous-requêtes ou UNION en utilisant l'opérateur ROLLUP :

 SELECT WD.C1, WD.C2, WD.C3, SUM(WD.Number) AS NW, SUM(CD.Number) AS NC FROM dbo.WaitingData WD LEFT OUTER JOIN CompletedData CD ON CD.C1 = WD.C1 AND CD.C2 = WD.C2 AND CD.C3 = WD.C3 GROUP BY WD.C1, WD.C2, WD.C3 WITH ROLLUP HAVING GROUPING_ID(WD.C1, WD.C2, WD.C3) IN (0, 7) AND SUM(WD.Number) <> 0