Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 将字符串值拆分为多列_Sql Server - Fatal编程技术网

Sql server 将字符串值拆分为多列

Sql server 将字符串值拆分为多列,sql-server,Sql Server,两个表中的数据被合并并显示,显示时我想将“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.

两个表中的数据被合并并显示,显示时我想将“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;
请注意,包括空格在内,共有219个字符。空格也要在列中指定

要求:

结果应为表1中的所有列+表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;
为“spec 219”的每个新创建列指定名称,例如:第1列=车型年,第2列=车型,…第219列=特殊经销商


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

您需要完成此查询以添加剩余列并在select之后指定别名。

您可以尝试使用以下语句,使用EXTER APPLY和VALUES表值构造函数来获得预期结果:

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'

spec219列是否总是包含219个字符,包括空格问题中的数据有178个字符?如果总是2019个字符,为什么不使用子字符串?旁注:@Zhorov是。它包含219个字符,包括空格谢谢!我得到下面的错误。我使用SQL Server 2012。Msg 195,级别15,状态10,第5行“SUSBSTRING”不是可识别的内置函数名。此外,最好使用明确的日期格式-yyyymmdd或yyyy mm ddThh:mm:ss。谢谢,很好!这也行得通。哪种方法是最好的,@MátéFarkas发布的方法或您的答案。我们将如何衡量。。按执行时间计算。您可以指导吗?@user27 Weel,这是您的选择,但您应该知道,PIVOT通过将表达式中一列的唯一值转换为输出中的多列来旋转表值表达式,并从中运行聚合。值表值构造函数构造一个表。我个人对这个具体案例的选择是价值观方法。