具有自定义值的行到列 SQL

Row to Column with Custom Value SQL

我有以下 table:

oSerial     oDateTime               oMessage1  
--------------------------------------------------
123456      2022-01-01 08:00:00     F1F           
123456      2022-01-01 08:10:00     F2F   
123456      2022-01-01 08:45:00     F5F
123456      2022-01-01 09:05:00     F1N

我想要得到以下结果:

oSerial     oDateTime              F1       F2     F3     F4     F5
--------------------------------------------------------------------
123456      2022-01-01 08:00:00    RED      
123456      2022-01-01 08:10:00             RED
123456      2022-01-01 08:45:00                                  RED
123456      2022-01-01 09:05:00    GREEN

所以,如果oMessage1下的最后一个字符是F,那么该值应该是RED。如果oMessage1下的最后一个字符是N,那么该值应该是GREEN。该值将根据 oMessage1 开头的 2 个字符放置在 F1 - F5 列下。

有什么建议吗?真的很感激。
谢谢。

你可以用这个

WITH tmp AS 
(
    SELECT 123456 AS oSerial, '2022-01-01 08:00:00' AS oDateTime, 'F1F' AS oMessage1 UNION ALL           
    SELECT 123456 AS oSerial, '2022-01-01 08:10:00' AS oDateTime, 'F2F' AS oMessage1 UNION ALL   
    SELECT 123456 AS oSerial, '2022-01-01 08:45:00' AS oDateTime, 'F5F' AS oMessage1 UNION ALL
    SELECT 123456 AS oSerial, '2022-01-01 09:05:00' AS oDateTime, 'F1N' AS oMessage1 
)
SELECT oSerial, oDateTime, 
    CASE 
        WHEN oMessage1 LIKE 'F1%' AND oMessage1 LIKE '%F' THEN 'RED'
        WHEN oMessage1 LIKE 'F1%' AND oMessage1 LIKE '%N' THEN 'GREEN'
    END AS f1,
    CASE 
        WHEN oMessage1 LIKE 'F2%' AND oMessage1 LIKE '%F' THEN 'RED'
        WHEN oMessage1 LIKE 'F2%' AND oMessage1 LIKE '%N' THEN 'GREEN'
    END AS f2,
    CASE 
        WHEN oMessage1 LIKE 'F3%' AND oMessage1 LIKE '%F' THEN 'RED'
        WHEN oMessage1 LIKE 'F3%' AND oMessage1 LIKE '%N' THEN 'GREEN'
    END AS f3,
    CASE 
        WHEN oMessage1 LIKE 'F4%' AND oMessage1 LIKE '%F' THEN 'RED'
        WHEN oMessage1 LIKE 'F4%' AND oMessage1 LIKE '%N' THEN 'GREEN'
    END AS f4,
    CASE 
        WHEN oMessage1 LIKE 'F5%' AND oMessage1 LIKE '%F' THEN 'RED'
        WHEN oMessage1 LIKE 'F5%' AND oMessage1 LIKE '%N' THEN 'GREEN'
    END AS f5
FROM tmp
ORDER BY oSerial, oDateTime;
    

如果你有超过 2 种颜色,那么你应该改成这个以避免重复代码:

CASE WHEN oMessage1 LIKE 'F1%' THEN
    CASE 
        WHEN oMessage1 LIKE '%F' THEN 'RED'
        WHEN oMessage1 LIKE '%N' THEN 'GREEN'
        WHEN oMessage1 LIKE '%O' THEN 'OTHERS COLOR 1'
        --WHEN oMessage1 LIKE '%X' THEN 'OTHERS COLOR X'
    END
END AS f1,
SELECT oSerial, oDateTime,
     CASE WHEN SUBSTR(oMessage1,1,2) = 'F1' THEN 
     CASE WHEN SUBSTR(oMessage1,3,3)='F' THEN 'RED' WHEN SUBSTR(oMessage1,3,3)='N' THEN 'GREEN' END 
     ELSE null END as F1,
     
     CASE WHEN SUBSTR(oMessage1,1,2) = 'F2' THEN 
     CASE WHEN SUBSTR(oMessage1,3,3)='F' THEN 'RED' WHEN SUBSTR(oMessage1,3,3)='N' THEN 'GREEN' END 
     ELSE null END as F2,
     
     CASE WHEN SUBSTR(oMessage1,1,2) = 'F3' THEN 
     CASE WHEN SUBSTR(oMessage1,3,3)='F' THEN 'RED' WHEN SUBSTR(oMessage1,3,3)='N' THEN 'GREEN' END 
     ELSE null END as F3,
     
     CASE WHEN SUBSTR(oMessage1,1,2) = 'F4' THEN 
     CASE WHEN SUBSTR(oMessage1,3,3)='F' THEN 'RED' WHEN SUBSTR(oMessage1,3,3)='N' THEN 'GREEN' END 
     ELSE null END as F4,
     
     CASE WHEN SUBSTR(oMessage1,1,2) = 'F5' THEN 
     CASE WHEN SUBSTR(oMessage1,3,3)='F' THEN 'RED' WHEN SUBSTR(oMessage1,3,3)='N' THEN 'GREEN' END 
     ELSE null END as F5
          
          FROM TableName