具有自定义值的行到列 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
我有以下 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