使用 CASE WHEN 和 IN 在 SQL 中创建计算列
Create a calculated column in SQL using CASE WHEN and IN
我如何创建一组新的列来搜索特定代码的行并根据 Oracle SQL 和 MySQL 中的搜索条件标记是或否?
背景:
我有一个客户代码 table,其中包含 ~20 多个列,这些列的代码与 CustomerID 记录相关联。不幸的是,这些列没有绑定到特定的代码,因此,每一列都可以包含任何代码。
Customer Code
CustomerID |col1|col2|col3|col4|col5|...|col20|
-----------------------------------------------
A | 0 | 0 | 10| 19 | 200|...| 50 |
B | 1 | 5 | 19 | 0 | 50 |...| 8 |
...
目标是创建一个子查询,其中包含多个带有客户 ID 的列,这些列将指示客户是否具有与其相关联的特定代码。例如,创建代码 10、代码 19 和代码 5 列,如果每个 CustomerID 在 table 的 20 列中的任何一列中有代码 10、19 或 5,则标记为“Y”,
结果看起来像这样..(新列以粗体显示)
CustomerID |col1|col2|col3|col4|col5|...|col20| **Code 10**| **Code 19** | **Code 5**
------------------------------------------------------------------------------------
A | 0 | 0 | 10| 19 | 200|...| 50 | **Y** | **Y** | **N**
B | 1 | 5 | 19 | 0 | 50 |...| 8 | **N** | **Y** | **Y**
...
当前在 Excel 中运行的进程:
在 Excel 中,我将创建一个名为“所有代码”的新列并连接所有包含代码的列。
新列将如下所示:
| All Codes |
----------------------
|0 0 10 19 200 ... 50 |
|1 5 19 0 50 ... 8 |
创建连接辅助列后,我使用 if and contain 文本函数为我需要的每个代码创建一个新列。结果如下所示:
| All Codes | Code 10 | Code 19 | Code 5
-------------------------------------------------------
|0 0 10 19 200 ... 50 | Y | Y | N
|1 5 19 0 50 ... 8 | N | Y | Y
然后我会删除所有代码并加入新的 table 和 CustomerID table。
感谢您的宝贵时间!
在你的非规范化结构上,你可以使用类似
的东西
WITH cte AS ( SELECT *, CONCAT_WS(',', col1, col2, ... , col20) total
FROM source_table )
SELECT *, CASE WHEN FIND_IN_SET(10, total) THEN 'Y' ELSE 'N' END AS Code10
FROM cte
使用case
和in
:
select t.*,
(case when 10 in (col1, col2, . . .)
then 'Y' else 'N'
end) as cod_10,
(case when 19 in (col1, col2, . . .)
then 'Y' else 'N'
end) as cod_19,
(case when 5 in (col1, col2, . . .)
then 'Y' else 'N'
end) as cod_5
from t;
. . .
用于其余代码列。
这是标准的 SQL,应该适用于任何数据库。
我建议您更改数据结构。你应该有一个 table 每个 customerId
和 code
一行,一个 customerCodes
table.
我如何创建一组新的列来搜索特定代码的行并根据 Oracle SQL 和 MySQL 中的搜索条件标记是或否?
背景:
我有一个客户代码 table,其中包含 ~20 多个列,这些列的代码与 CustomerID 记录相关联。不幸的是,这些列没有绑定到特定的代码,因此,每一列都可以包含任何代码。
Customer Code
CustomerID |col1|col2|col3|col4|col5|...|col20|
-----------------------------------------------
A | 0 | 0 | 10| 19 | 200|...| 50 |
B | 1 | 5 | 19 | 0 | 50 |...| 8 |
...
目标是创建一个子查询,其中包含多个带有客户 ID 的列,这些列将指示客户是否具有与其相关联的特定代码。例如,创建代码 10、代码 19 和代码 5 列,如果每个 CustomerID 在 table 的 20 列中的任何一列中有代码 10、19 或 5,则标记为“Y”,
结果看起来像这样..(新列以粗体显示)
CustomerID |col1|col2|col3|col4|col5|...|col20| **Code 10**| **Code 19** | **Code 5**
------------------------------------------------------------------------------------
A | 0 | 0 | 10| 19 | 200|...| 50 | **Y** | **Y** | **N**
B | 1 | 5 | 19 | 0 | 50 |...| 8 | **N** | **Y** | **Y**
...
当前在 Excel 中运行的进程: 在 Excel 中,我将创建一个名为“所有代码”的新列并连接所有包含代码的列。
新列将如下所示:
| All Codes |
----------------------
|0 0 10 19 200 ... 50 |
|1 5 19 0 50 ... 8 |
创建连接辅助列后,我使用 if and contain 文本函数为我需要的每个代码创建一个新列。结果如下所示:
| All Codes | Code 10 | Code 19 | Code 5
-------------------------------------------------------
|0 0 10 19 200 ... 50 | Y | Y | N
|1 5 19 0 50 ... 8 | N | Y | Y
然后我会删除所有代码并加入新的 table 和 CustomerID table。
感谢您的宝贵时间!
在你的非规范化结构上,你可以使用类似
的东西WITH cte AS ( SELECT *, CONCAT_WS(',', col1, col2, ... , col20) total
FROM source_table )
SELECT *, CASE WHEN FIND_IN_SET(10, total) THEN 'Y' ELSE 'N' END AS Code10
FROM cte
使用case
和in
:
select t.*,
(case when 10 in (col1, col2, . . .)
then 'Y' else 'N'
end) as cod_10,
(case when 19 in (col1, col2, . . .)
then 'Y' else 'N'
end) as cod_19,
(case when 5 in (col1, col2, . . .)
then 'Y' else 'N'
end) as cod_5
from t;
. . .
用于其余代码列。
这是标准的 SQL,应该适用于任何数据库。
我建议您更改数据结构。你应该有一个 table 每个 customerId
和 code
一行,一个 customerCodes
table.