Grouper par sql pour deux conditions

J'ai cette table

SELECT [WeldStatus] ,PackageId FROM [SPMS2].[dbo].[JointHistory] 

entrez la description de l'image ici

Comment puis-je regrouper par cette requête pour calculer le total testpackage et le total accept et le total remain ?

Par exemple pour packageid = 6030 j'ai besoin de ceci:

 packageid total accept remain 6030 4 3 1 

Utiliser CASE et Group By

 SELECT PackageId, count(*) as total, sum(case [WeldStatus] when 'Accept' then 1 end) as accept, sum(case [WeldStatus] when 'accept' then 0 else 1 end) as remain FROM [SPMS2].[dbo].[JointHistory] group by PackageId; 
 SELECT packageid ,count(*) as 'total' ,sum(case when weldstatus = 'Accept' then 1 else 0 end) as 'accept' ,sum(case when weldstatus is null then 1 else 0 end) as 'remain' FROM [SPMS2].[dbo].[JointHistory] group by packageid 

"Somme (cas quand …" m'a sauvé tant de fois.) Les NULL peuvent être pénibles mais c'est le cas quand on vous sauve.

Vous pouvez utiliser l'expression CASE dans votre agrégation pour get la sortie souhaitée.

 SELECT PackageId, SUM (CASE WHEN WeldStatus = 'Accept' THEN 1 ELSE 0 END) AS AcceptCount, SUM (CASE WHEN WeldStatus IS NULL THEN 1 ELSE 0 END) AS RemainCount, COUNT (*) AS Total FROM [SPMS2].[dbo].[JointHistory] GROUP BY PackageId 
 select packageid, SUM(TOTAL), SUM(ACCEPT), SUM(REMAIN) from ( select packageid, 1 as TOTAL, case when WeldStatus='Accept' then 1 else 0 END as ACCEPT, case when WeldStatus IS NULL then 1 else 0 END as REMAIN from JointHistory ) group by packageid 

Si WeldStatus prend seulement les valeurs de 'Accept' ou NULL , alors une méthode simple est:

 SELECT PackageId, count(*) as total, count(WeldStatus) as accept, count(*) - count(WeldStatus) as remain FROM [SPMS2].[dbo].[JointHistory] jh GROUP BY PackageId; 

Je suis le premier à admettre que cela repose sur l'hypothèse d'avoir une seule valeur ou NULL .

SELECT PackageId, COUNT (*) COM total, SUM (CAS WHEN [WeldStatus] = 'Accepter' THEN 1 END) AS accepter, SUM (CAS QUAND ISNULL ([WeldStatus], '') = '' THEN 1 ELSE 0 END) AS rest FROM [SPMS2]. [Dbo]. [JointHistory] groupe par PackageId;