当前位置: 首页 > 面试题库 >

SQL查询以单行形式返回分组结果

端木朝
2023-03-14
问题内容

如果我有一个工作表,例如:

|id|created_at  |status    |
----------------------------
|1 |01-01-2015  |error     |
|2 |01-01-2015  |complete  |
|3 |01-01-2015  |error     |
|4 |01-02-2015  |complete  |
|5 |01-02-2015  |complete  |
|6 |01-03-2015  |error     |
|7 |01-03-2015  |on hold   |
|8 |01-03-2015  |complete  |

我想要一个查询,该查询将按日期对它们进行分组,并计算该日期的每个状态和总状态的发生率。

SELECT created_at status, count(status), created_at 
FROM jobs 
GROUP BY created_at, status;

这给了我

|created_at  |status    |count|
-------------------------------
|01-01-2015  |error     |2
|01-01-2015  |complete  |1
|01-02-2015  |complete  |2
|01-03-2015  |error     |1
|01-03-2015  |on hold   |1
|01-03-2015  |complete  |1

我现在想将其压缩为每个created_at唯一日期的一行,并为每个日期安排某种多列布局status。一个约束是status5个可能的单词中的任何一个,但每个日期可能没有每个状态之一。另外,我希望每天总计所有状态。因此,所需的结果将如下所示:

|date        |total |errors|completed|on_hold|
----------------------------------------------
|01-01-2015  |3     |2     |1        |null   
|01-02-2015  |2     |null  |2        |null
|01-03-2015  |3     |1     |1        |1

列可以通过类似的方式动态构建

SELECT DISTINCT status FROM jobs;

对于不包含任何此类状态的日期,结果为空。我不是SQL专家,但尝试在数据库视图中执行此操作,因此不必在Rails中进行多个查询。

我正在使用Postresql,但想尝试保持SQL的直接性。我试图理解聚合函数,足以使用其他一些工具,但没有成功。


问题答案:

以下内容应在任何RDBMS中起作用:

SELECT created_at, count(status) AS total,
       sum(case when status = 'error' then 1 end) as errors,
       sum(case when status = 'complete' then 1 end) as completed,
       sum(case when status = 'on hold' then 1 end) as on_hold
FROM jobs 
GROUP BY created_at;

该查询使用 条件聚合 ,以便 透视
分组的数据。假定status值是事先已知的。如果您还有其他status值的情况,则只需添加相应的sum(case ...表达式即可。

演示在这里



 类似资料:
  • 问题内容: 背景 我需要从Oracle提取几千行并将其转换为JSON,以便在SlickGrid中使用。目前,我正在获取PHP中的行,使用iconv将其从ISO转换为UTF-8,并使用json_encode导出到json。整个操作在数据库端大约需要1秒,而生成JSON则需要5秒。这是很长的路要走。 问题 我已经读到Oracle 12c支持JSON,但是我找不到我真正需要的东西。 有没有办法以json

  • 问题内容: 我有以下收藏 我要收集所有其 在主阵列 我已经试过了 但这给了我这样的输出 我想要这样的输出 问题答案: 你可以。与mongoose一起使用,因为它返回一个数组,与使用相比,简单使用更好 或使用核心驱动程序中的基础: 如果您不希望获得“与众不同”的结果,则与之大致相同: 或与 您还可以使用,基本上可以改变聚合过程和“幕后”(“仅返回字段部分”,而不是独特的聚合方法): MongoDB本

  • 问题内容: 以下查询应返回从动漫中扮演角色的人物的姓名。但我收到以下错误: Blockquote ORA-01427:单行子查询返回多个行 提前致谢! 问题答案: 代替 使用 查询中有5个条件需要更改。 UPD 另外,您的查询等同于

  • 我有下面的SQL查询,我在flink工作中使用。< code>mysql_table是使用JDBC连接器创建的,而< code>kafa_source表是从传入的kafka流创建的。 我在两者之间执行时态连接,当我在Flink的sql-client CLI中检查时,运行良好(用< code>flink-faker测试)。内部查询工作得非常好,并且正在打印结果。有人能帮助我找出这个问题吗? 编辑:我

  • 我有以下表格结构: 1-课程(course_id、course_nam、语言、course_price、create_date、average_rating、course_description、certifica_price、course_creator_id) 2-学生(学生证、钱包) 3-折扣(折扣id、折扣课程id、允许的许可课程id、开始日期、结束日期、百分比) 4-报名(student

  • 本文向大家介绍Python Sqlite3以字典形式返回查询结果的实现方法,包括了Python Sqlite3以字典形式返回查询结果的实现方法的使用技巧和注意事项,需要的朋友参考一下 sqlite3本身并没有像pymysql一样原生提供字典形式的游标。 但官方文档里已经有预留了相应的实现方案。 使用这个函数代替conn.raw_factory属性即可。 官方文档链接 以上就是小编为大家带来的Pyt