使用CASE WHEN和IN

时间:2020-10-28 06:10:40

标签: mysql sql excel toad-data-point

如何创建一组新列来搜索特定代码行并根据Oracle SQL和MySQL中的搜索条件标记是或否?

背景:

我有一个客户代码表,其中包含约20多个列以及与客户ID记录相关的代码。不幸的是,这些列没有绑定到特定的代码,因此,每个列都可以包含任何代码。

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列,如果每个客户ID在表的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和contains文本函数为需要的每个代码创建一个新列。结果如下:

|    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

然后,我将删除所有代码,并将新表与CustomerID表联接起来。

谢谢您的时间!

2 个答案:

答案 0 :(得分:1)

在非规范化结构上,您可以使用类似

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

答案 1 :(得分:1)

使用casein

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,可以在任何数据库中使用。

我建议您更改数据结构。您应该有一个表,其中每个customerIdcode一行,一个customerCodes表。

相关问题