J'ai cette table
SELECT [WeldStatus] ,PackageId FROM [SPMS2].[dbo].[JointHistory]
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;