首页 > 解决方案 > 将字符串值拆分为多列

问题描述

连接并显示来自 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. 结果应该是表 1 中的所有列 + 表 2 中的所有列('spec 219' 被拆分为 219 列)

  2. 为“spec 219”的每个新创建的列分配名称,例如:第 1 列 = 模型年,第 2 列 = 模型,...第 219 列 = 'SPECIAL DISTRIBUT

标签: sql-server

解决方案


这是您的查询。它可能有错误,因为我不知道哪个列属于哪个表(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

您需要完成此查询以添加其余列并在选择后指定别名。


推荐阅读