2010-09-02 140 views
3

产品按照大约20个标准进行检查和合格/不合格。 他们想要一份报告来统计每个团体有多少个每个缺陷。多个GROUP BY列合并为一列

缺陷*为varchar(3),用于标识哪些条件失败。
表有3列缺陷,我可以像回到他们:SQL Server上

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 

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 

其中给出的输出,如:

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 
... 

所需的输出7,是的,我知道。

回答

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 
+0

谢谢,这正是我一直在寻找。 – 182764125216 2010-09-02 17:14:04

0

对于SQL Server 2005/2008,请使用UNPIVOT函数。
我没有测试过,所以考虑为伪代码:
SELECT组ID,DefectType,COUNT(*)AS纪录

--building表
--GroupID缺陷DefectType
--RF-061 Defect1 CPP
--RF-061 Defect1 FPV
--.............

SELECT组ID,缺陷,DefectType
FROM
(SELECT组ID,Defect1,缺陷2,缺陷3
从产品)p
UNPIVOT
(DefectType FOR缺陷(Defect1,Defect2,Defect3)
)AS unpvt
)×

+0

OP在SQL Server 7上! – 2010-09-02 22:52:55

+0

我对这个错误表示歉意,联盟在这种情况下是你的朋友。 – dragos55 2010-09-03 08:34:24