SQL 查询case when without else or doing nothing?
SQL query case when without else or do nothing?
假设我在 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
你需要在这里使用 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
表达式将 return NULL
,然后将被 MAX
.
忽略
假设我在 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
你需要在这里使用 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
表达式将 return NULL
,然后将被 MAX
.