【问题标题】:SQL multiple count for different condition as new column不同条件的 SQL 多次计数为新列
【发布时间】:2021-11-20 13:26:40
【问题描述】:

我有两个表,其中包含一个列 ID 和一个标志。 我想在一行中获取行数,其中 table2.id = some condition; 带着这个要求:

select table1.ID, table1.FLAG, count(1) row_count
from table1,
     table2
where table1.ID = 123
 and table1.ID = table2.ID
group by table1.ID, table1.FLAG, table2.FLAG

如果 table2.FLAG 有 3 个不同的值(Active、Suspend、Other),那么我有 3 行,问题是如何将这三行组合成这样的: ID、FLAG、Active_Count、Suspend_Count、Other_Count。

【问题讨论】:

  • 请使用现代连接语法,而不是 FROM 子句中的逗号分隔表。
  • 使用 case 表达式进行条件聚合。并从 GROUP BY 中删除 table2.FLAG。
  • 表1中的ID是否唯一?
  • @Del 是的,表 1 有 1 行具有唯一 id,表 2 有更多行 id = table1.id
  • 如果您包含一个最小的 SQL 数据集,它可以帮助我们提供更广泛的社区可以访问的有意义的解释,显示您当前的结果以及您期望的结果。

标签: sql oracle count pivot


【解决方案1】:

好的,假设 ID 在表 1 中是唯一的,您正在寻找这样的内容:

WITH test_data_1 (ID, FLAG) AS
(
  SELECT 123, 'Y' FROM DUAL UNION ALL
  SELECT 234, 'N' FROM DUAL
),
test_data_2 (ID, FLAG) AS
(
  SELECT 123, 'Active' FROM DUAL UNION ALL
  SELECT 123, 'Active' FROM DUAL UNION ALL
  SELECT 123, 'Suspend' FROM DUAL UNION ALL
  SELECT 123, 'Other' FROM DUAL UNION ALL
  SELECT 234, 'Active' FROM DUAL UNION ALL
  SELECT 234, 'Active' FROM DUAL UNION ALL
  SELECT 234, 'Other' FROM DUAL
)
SELECT *
FROM test_data_1 td1
INNER JOIN test_data_2 
  PIVOT (COUNT(*) AS COUNT FOR FLAG IN ('Active' AS ACTIVE, 'Suspend' AS SUSPEND, 'Other' AS OTHER)) td2 
  ON td1.id = td2.id;

注意在加入前使用PIVOT 格式化表2。

【讨论】:

    【解决方案2】:

    只需使用CASE inline if 语句来隔离每列中所需的值,这是一种 PIVOT 或反规范化技术,无需设置 PIVOT 子句的开销

    SELECT table1.ID, table1.FLAG
     ,COUNT(CASE WHEN table2.FLAG = 'Active' THEN 1 END) as "Active"
     ,COUNT(CASE WHEN table2.FLAG = 'Suspended' THEN 1 END) as "Suspended"
     ,COUNT(CASE WHEN table2.FLAG = 'Other' THEN 1 END) as "Other"
    FROM table1
    INNER JOIN table2 ON table1.ID = table2.ID
    WHERE table1.ID = 123
    GROUP BY table1.ID, table1.FLAG
    

    注意:SUM 可以在这里代替 count,count 有效,因为缺少的 ELSE 语句将解析为 null,而 Count 不会计算 null。

    【讨论】:

    • 感谢@BarbarosÖzhan 我想我很难摆脱对甲骨文的偏见;)
    猜你喜欢
    • 2015-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-10
    • 2021-02-24
    相关资源
    最近更新 更多