将字符串值分割成多列

问题描述 投票:1回答:2

将2个表的数据合并并显示,在显示时,我想将列'规格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中的所有列('规格219'要拆成219列)。

  1. 结果应是表1中的所有列+表2中的所有列("规格219 "将被分割成219列)

  2. 为 "规格219 "中的每一列指定名称,例如:第1列=型号年,第2列=型号,......第219列="特殊分配"。

sql-server
2个回答
1
投票

你可以尝试用下面的语句,uisng OUTER APPLYVALUES 表值构造函数来获得预期的结果。

SELECT * 
FROM [CTMS].[dbo].[NUTQCDATA] a
LEFT JOIN [CTMS].[dbo].[MES_IF_ORDER_TRK] b ON a.body_no = b.body_no
OUTER APPLY (VALUES (
    SUBSTRING(b.[spec 219], 1, 1),
    SUBSTRING(b.[spec 219], 2, 1),
    ...,
    SUBSTRING(b.[spec 219], 219, 1)
)) v ([MODEL YEAR], [MODEL], ..., [SPECIAL DISTRIBUT])
WHERE a.reg_tm >= '2020-03-20T00:00:00' AND a.reg_tm <= '2020-03-20T23:59:59'

1
投票

这是你的查询.它可能会出错,因为我不知道哪一列属于哪个表(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

你需要完成这个查询来添加剩余的列并在选择后指定别名。

© www.soinside.com 2019 - 2024. All rights reserved.