【问题标题】:multiple GROUP BY columns into one column多个 GROUP BY 列合并为一列
【发布时间】:2010-09-02 16:49:56
【问题描述】:

产品根据大约 20 个标准进行分组以进行检查和通过/失败。 他们需要一份报告来计算单个组的每个缺陷的数量。

Defect* 是 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

输出如下:

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

期望的输出:

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

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

【问题讨论】:

    标签: sql sql-server count group-by


    【解决方案1】:

    您可以使用 View 来模拟 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
    

    【讨论】:

    • 谢谢,这正是我想要的。
    【解决方案2】:

    对于 SQL Server 2005/2008,使用 UNPIVOT 函数。
    我没有测试,所以认为是伪代码:
    SELECT GroupID, DefectType, COUNT(*) AS Occurrences
    来自
    --建表
    --GroupID 缺陷缺陷类型
    --RF-061 缺陷 1 CPP
    --RF-061 缺陷 1 FPV
    --................
    (
    选择组 ID、缺陷、缺陷类型
    来自
    (选择组 ID、缺陷 1、缺陷 2、缺陷 3
    来自产品) p
    取消透视
    (DefectType FOR Defect IN (Defect1, Defect2, Defect3)
    )AS unpvt
    ) x

    【讨论】:

    • 我为这个错误道歉,在这种情况下,UNION 是你的朋友。
    猜你喜欢
    • 2021-12-16
    • 1970-01-01
    • 2021-05-01
    • 1970-01-01
    • 2017-09-16
    • 2011-10-21
    • 1970-01-01
    • 2023-02-11
    • 1970-01-01
    相关资源
    最近更新 更多