没有 else 或啥都不做的 SQL 查询案例?

Posted

技术标签:

【中文标题】没有 else 或啥都不做的 SQL 查询案例?【英文标题】:SQL query case when without else or do nothing?没有 else 或什么都不做的 SQL 查询案例? 【发布时间】:2019-11-27 08:19:41 【问题描述】:

假设我在table_name_a 中有一些示例数据,如下所示:

    code     val_a  val_b    remark   date
   ------------------------------------------
1   00001    500    0.1      111      20191108
2   00001    1000   0.2      222      20191109
3   00002    200    0.1      111      20191110
4   00002    400    0.3      222      20191111
5   00001    200    0.2      333      20191112
6   00001    400    0.1      444      20191113

我的预期输出如下:


        code    111_a  111_b 222_a 222_b 333_a ....
       --------------------------------------------
    1   00001    500    ..    ..     ..   ..    

并且下面的 SQL 查询将包含 0 值,该值覆盖了正确的值,是否可以在没有 Else 的情况下进行查询或什么也不做?

SELECT code, date,
       CASE WHEN t.remark='111' THEN t.val_a ELSE 0 END 111_a,
       CASE WHEN t.remark='111' THEN t.val_b ELSE 0 END 111_b,
       CASE WHEN t.remark='222' THEN t.val_a ELSE 0 END 222_a,
       CASE WHEN t.remark='222' THEN t.val_b ELSE 0 END 222_b,
       CASE WHEN t.remark='333' THEN t.val_a ELSE 0 END 333_a,
       CASE WHEN t.remark='333' THEN t.val_b ELSE 0 END 333_b,
       CASE WHEN t.remark='444' THEN t.val_a ELSE 0 END 444_a,
       CASE WHEN t.remark='444' THEN t.val_b ELSE 0 END 444_b,
FROM table_name_a t

【问题讨论】:

您希望所有 00001 值都在一行中吗?完成预期结果,使其与示例表数据匹配。 【参考方案1】:

您需要在此处使用带有旋转逻辑的MAX,尽管您在正确的轨道上:

SELECT
    code,
    MAX(CASE WHEN remark = '111' THEN val_a END) 111_a,
    MAX(CASE WHEN remark = '111' THEN val_b END) 111_b,
    MAX(CASE WHEN remark = '222' THEN val_a END) 222_a,
    MAX(CASE WHEN remark = '222' THEN val_b END) 222_b,
    MAX(CASE WHEN remark = '333' THEN val_a END) 333_a,
    MAX(CASE WHEN remark = '333' THEN val_b END) 333_b,
    MAX(CASE WHEN remark = '444' THEN val_a END) 444_a,
    MAX(CASE WHEN remark = '444' THEN val_b END) 444_b
FROM table_name_a
GROUP BY
    code;

这里的逻辑是有效的,因为对于属于单个代码的每组记录,我们仅在某些条件下取最大值,在这种情况下,对于某些备注值。如果条件为假,则CASE 表达式将返回NULL,然后MAX 将忽略它。

【讨论】:

嗨蒂姆,非常感谢,你真的拯救了我的一天,谢谢☕️☕️??​​pan> @TimBiegeleisen 不需要date 列? @Moudiz 我猜不是;如果预计日期,那么 OP 还必须为此显示适当的数据。 @Moudiz 嘿,在我的示例中它需要date 嗨蒂姆,没有数据的其他数据将保存到Nonenan,我可以用0保存它们吗?

以上是关于没有 else 或啥都不做的 SQL 查询案例?的主要内容,如果未能解决你的问题,请参考以下文章

添加一个没有 Thread.sleep 的延迟和一个啥都不做的 while 循环

Netcool/OMNIbus SQL 过程没有运行\啥都不做

map() + lambda else 子句如何啥都不做

PHPUnit - 啥都不做,没有错误,没有输出

使用来自firestore数据库的geoflutterfire查询结果,使用flutter应用程序返回null或啥都没有,但语法没有错误

如何创建啥都不做的#define?