使用 Case When 语句查询以获取 2 种不同条件下的 ID 计数

Query to Get Counts of Ids under 2 different Conditions with Case When Statement

所以我有一个 Table 结构,如下所示。

条件如下:

  1. 我称'Tag'为ID,Condition(x)的none为NULL。
  2. 我调用 'UnTag' 因为具有任何条件 (x) 的 ID 为 NULL。
  3. 我想按以下格式对 'Classification1' 进行分类:

我想要以下结构的输出:

我写了一个代码,但不知何故没有给我想要的结果。 我使用 Case when 对 Classification1 进行分类,然后 运行 一个用于取出 Count 的子查询。 如果有不同的方法以及如何在 Group by 语句中合并案例,请提供帮助。

我写了这个查询: SELECT CASE WHEN UPPER(CM1.Classification1) IN ('A', 'C','G') THEN 'X' WHEN UPPER(CM1.Classification1) IN ('B', 'F') THEN 'Y' WHEN UPPER(CM1.Classification1) IN ('D', 'E') THEN 'Z' ELSE 'Undefined' END AS New_Classification, (SELECT COUNT(CASE WHEN UPPER(CM2.Classification1) IN ('A', 'C','G') THEN 'X' WHEN UPPER(CM2.Classification1) IN ('B', 'F') THEN 'Y' WHEN UPPER(CM2.Classification1) IN ('D', 'E') THEN 'Z' ELSE 'Undefined' END) FROM TABLE1 CM2 WHERE CM2.Condition1 IS NOT NULL AND CM2.Condition2 IS NOT NULL AND CM2.Condition3 IS NOT NULL AND CM2.Condition4 IS NOT NULL AND CM1.ID=CM2.ID) AS Count_of_tagged, (SELECT COUNT(CASE WHEN UPPER(CM3.Classification1) IN ('A', 'C','G') THEN 'X' WHEN UPPER(CM3.Classification1) IN ('B', 'F') THEN 'Y' WHEN UPPER(CM3.Classification1) IN ('D', 'E') THEN 'Z' ELSE 'Undefined' END) FROM TABLE1 CM3 WHERE (CM3.Condition1 IS NULL OR CM3.Condition2 IS NULL OR CM3.Condition3 IS NULL OR CM3.Condition4 IS NULL) AND CM1.ID=CM2.ID) AS Count_of_untagged FROM TABLE1 CM1

你不应该需要子查询,作为我想出的起点:

    SELECT CASE Classification1
             WHEN 'A' THEN 'X'
             WHEN 'B' THEN 'Y'
             WHEN 'C' THEN 'X'
             WHEN 'D' THEN 'Z'
             WHEN 'E' THEN 'Z'
             WHEN 'F' THEN 'Y'
             WHEN 'G' THEN 'X'
           END new_classification,
           SUM(
             Condition1 IS NOT NULL AND
             Condition2 IS NOT NULL AND
             Condition3 IS NOT NULL AND
             Condition4 IS NOT NULL  /* 1 for true, 0 for false */          
           ) tagged_count,
           SUM(
             Condition1 IS NULL OR
             Condition2 IS NULL OR
             Condition3 IS NULL OR
             Condition4 IS NULL            
           ) untagged_count,
      FROM table_name
  GROUP BY new_classification

可以试试下面的sql,告诉我这是否是你需要的

select 
CASE 
      WHEN classification ='A'  THEN 'X'
      WHEN classification ='B'  THEN 'Y'
      WHEN classification ='C'  THEN 'X'
      WHEN classification ='D'  THEN 'Z'
      WHEN classification ='E'  THEN 'Z'
      WHEN classification ='F'  THEN 'Y'
      WHEN classification ='G'  THEN 'X'
END as classification, 
sum(case when condition1 is not null and condition2 is not null and condition3 is not null and condition4 is not null then 1 else 0 end) as tagged
sum(case when condition1 is null or condition2 is null or condition3 is null or  condition4 is null then 1 else 0 end) as untagged
 from table
GROUP   BY CASE 
      WHEN classification ='A'  THEN 'X'
      WHEN classification ='B'  THEN 'Y'
      WHEN classification ='C'  THEN 'X'
      WHEN classification ='D'  THEN 'Z'
      WHEN classification ='E'  THEN 'Z'
      WHEN classification ='F'  THEN 'Y'
      WHEN classification ='G'  THEN 'X'
END ;