SQL查询时没有其他内容或什么都不做?

问题描述 投票:0回答:1

假设我在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
sql oracle pivot case-when
1个回答
3
投票

尽管您在正确的轨道上,但您仍需要在此处将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忽略。

© www.soinside.com 2019 - 2024. All rights reserved.