sql-server - 将字符串值拆分为多列
问题描述
连接并显示来自 2 个表的数据,同时显示我想将列 'spec 219' 的值拆分为 219 列
SELECT * FROM
(SELECT *
FROM [CTMS].[dbo].[NUTQCDATA]
WHERE reg_tm >= '20200320000000' and reg_tm <= '20200320235959') a
LEFT JOIN
(SELECT *
FROM [CTMS].[dbo].[MES_IF_ORDER_TRK]) b
ON a.body_no = b.body_no;
结果
.-----------.------------.---------.--------.---------.----------------.----------------.----------.-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------.
| device_id | body_no | snetchk | stn_cd | stn_seq | stn_dt | reg_date | use_flag | spec219 |
:-----------+------------+---------+--------+---------+----------------+----------------+----------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------:
| DIAP133 | B4B 078913 | 1 | 3510 | 58 | 20200320020026 | 20200320020300 | 1 | L4RAG 5UJ423A8 P EE13 442BACN21 5116CNT8T3C 1 E212 1 1 32 CBA R 1R1 FA 121 4 5UR2 25NC 2S 12 1S HMC2 3 3 L11 2411 8 T 11 P P B1 GG F C2 BO CG 13 3 ON 1F 18 G R 3 N 4B1D L A C 11 |
'-----------'------------'---------'--------'---------'----------------'----------------'----------'-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------'
请注意,有 219 个字符,包括空格。空格也应在列中分配。
要求:
结果应该是表 1 中的所有列 + 表 2 中的所有列('spec 219' 被拆分为 219 列)
为“spec 219”的每个新创建的列分配名称,例如:第 1 列 = 模型年,第 2 列 = 模型,...第 219 列 = 'SPECIAL DISTRIBUT
解决方案
这是您的查询。它可能有错误,因为我不知道哪个列属于哪个表(a 或 b)。我简化了您的查询,并给出了将这些字段拆分为列的逻辑:
SELECT device_id, body_no, snetchk, stn_cd, stn_seq, stn_dt, reg_date, use_flag,
[1], [2], [3], [4], [5], [6], [7], [8], [9], [10] --, etc
FROM (
SELECT a.*, spec219.[id], spec219.[char]
FROM [CTMS].[dbo].[NUTQCDATA] a
LEFT JOIN [CTMS].[dbo].[MES_IF_ORDER_TRK] b ON a.body_no = b.body_no
OUTER APPLY (
select nums.id, substring(b.spec219, nums.id, 1) [char]
from (
select top (219) row_number() over(order by (select null)) id
from sys.objects o1, sys.objects o2
order by 1
) nums
) spec219
WHERE a.reg_tm >= '20200320000000' and a.reg_tm <= '20200320235959'
) t
pivot(max([char]) for [id] in ([1], [2], [3], [4], [5], [6], [7], [8], [9], [10])) p
您需要完成此查询以添加其余列并在选择后指定别名。
推荐阅读
- javascript - 如何从消费者更新提供者中的上下文值?
- java - 从 Java 程序调用 Kotlin 时找不到 kotlin-reflection.jar
- python - 什么字段用于高度?
- rest - @pathparam 以及 apache-cxf webservice 的 POST 有效负载
- android - 为什么三星 SM-J5008 (Lollipop) 重启后不触发 onReceive()?
- linux - 在同一域上托管多个项目但路径不同
- powershell - 带有详细信息的复制项后的 Powershell 错误消息
- html - 对象数组的表单控件
- command-line-interface - 调用“watch”时 Parcel.js 命令行界面错误
- matlab - 在 cftool 中设置方程并自动去除异常值