多个GROUP BY列成一列

182*_*216 3 sql sql-server group-by count

产品按约20个标准分组进行检查和通过/失败.他们想要一份报告,计算每个组中每个缺陷的数量.

缺陷*是varchar(3),用于标识哪些标准失败.
该表有3列缺陷,我可以用以下内容返回:

SELECT GroupID,
    Defect1, COUNT(Defect1) as Occ1,
    Defect2, COUNT(Defect2) as Occ2,
    Defect3, COUNT(Defect3) as Occ3
FROM Product
WHERE Run = 1728 AND Defect1 IS NOT NULL
GROUP BY GroupID, Defect1, Defect2, Defect3
ORDER BY GroupID
Run Code Online (Sandbox Code Playgroud)

这给出了如下输出:

GroupID Def1    Occ1    Def2    Occ2    Def3    Occ3
RF-061   CPP       1     FPV       1    null       0
RF-061   FPV       1     CPP       1    null       0
RF-061   HCR       1     CHP       1    null       0
RF-061   CHP       1     FPV       1    null       0
RF-061   FBL       1     HCR       1     FPT       1
RF-061   CHP       1     CPP       1     HCR       1
RF-061   CHP       1     CPP       1    null       0
RF-061   CPP       1     FBL       1    null       0
...
Run Code Online (Sandbox Code Playgroud)

期望的输出:

GrPupID Def Occurrences
BF-061  FPV 4
BF-061  CPP 5
BF-061  CHP 5
BF-061  HCR 5
BF-061  FBL 3
BF-061  PPC 1
BF-061  FPT 1
Run Code Online (Sandbox Code Playgroud)

在SQL Server 7上,是的,我知道.

Mar*_*ith 5

您可以使用视图来模拟1NF表,然后它会很简单.

CREATE VIEW tempView
AS
SELECT GroupID, Defect1 AS Defect, Run 
FROM Product
UNION ALL
SELECT GroupID, Defect2 AS Defect, Run 
FROM Product
UNION ALL
SELECT GroupID, Defect3 AS Defect, Run 
FROM Product

GO

SELECT GroupID, Defect, COUNT(*) AS Occurrences
FROM tempView
WHERE Run = 1728 
GROUP BY GroupID, Defect
ORDER BY GroupID
Run Code Online (Sandbox Code Playgroud)