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:如何将行转换为列(需要另一种方法)_Sql Server_Multiple Columns_Rows_Transpose - Fatal编程技术网

Sql server SQL:如何将行转换为列(需要另一种方法)

Sql server SQL:如何将行转换为列(需要另一种方法),sql-server,multiple-columns,rows,transpose,Sql Server,Multiple Columns,Rows,Transpose,类似的问题有一个很好的答案 但是,提供的解决方案依赖于一个pivot,它是某种类型的ID列。如果我没有ID,并且我也不想通过创建一个带有行号的ID来减慢查询速度,该怎么办 样本数据: MyDataColumn CRDB1901SAUTSVCNXMN0004666000001 CRDB1901SAUTSV CNXMN0004666 CRDB1901SAUTSVCNXMN0004683000001 CRDB1901SAUTSV CNXMN0004683 CRDB1901SAUTSVCNSHK0216

类似的问题有一个很好的答案

但是,提供的解决方案依赖于一个pivot,它是某种类型的ID列。如果我没有ID,并且我也不想通过创建一个带有行号的ID来减慢查询速度,该怎么办

样本数据:

MyDataColumn
CRDB1901SAUTSVCNXMN0004666000001
CRDB1901SAUTSV
CNXMN0004666
CRDB1901SAUTSVCNXMN0004683000001
CRDB1901SAUTSV
CNXMN0004683
CRDB1901SAUTSVCNSHK021697000001
CRDB1901SAUTSV
CNSHK021697
唯一给出的是在我的列中有三个不同值的模式。因此,每4行重复一次转置。我想要这个

COLA                             COLB           COLC
CRDB1901SAUTSVCNXMN0004666000001 CRDB1901SAUTSV CNXMN0004666
CRDB1901SAUTSVCNXMN0004683000001 CRDB1901SAUTSV CNXMN0004683
CRDB1901SAUTSVCNSHK021697000001  CRDB1901SAUTSV CNSHK021697
etc
这是我的尝试,但我在src.ManifestID上得到了无法绑定的错误

select src.ManifestID, [1], [2], [3]
from
(
  SELECT a.Token AS ManifestID
        FROM VisitManifests AS vm
            CROSS APPLY dbo.fnTokenizer(vm.Note, ':') AS a
        WHERE CHARINDEX('Manifest ID:', vm.Note) > 0
          AND CHARINDEX('Message ID:', vm.Note) > 0
          AND CHARINDEX('Manifest ID:', vm.Note) < CHARINDEX('Message ID:', vm.Note)
          AND a.Token > 1
) as src
pivot
(
  max(src.ManifestID)
  for ManifestID in ([1],[2],[3])
) piv;

您可以尝试如下自连接。如果我猜对了,可乐的第一部分是可乐,中间部分是可乐,最后一部分是序列号。如果上述逻辑总是正确的,那么下面的脚本应该可以满足您的需要

SELECT DISTINCT A.MyDataColumn ColA,
B.MyDataColumn ColB,
C.MyDataColumn ColC
FROM your_table A
INNER JOIN your_table B 
    ON A.MyDataColumn LIKE ''+B.MyDataColumn+'%' 
    AND A.MyDataColumn <> B.MyDataColumn
INNER JOIN your_table C 
    ON A.MyDataColumn LIKE '%'+C.MyDataColumn+'%' 
    AND A.MyDataColumn <> C.MyDataColumn 
    AND B.MyDataColumn  <> C.MyDataColumn

关系数据库中的行没有定义的排序顺序。没有第四行这样的东西,除非您有一些列可以用于订单by@a_horse_with_no_name添加了标签-SQLServer。我正在查看PIVOT功能。必须有一种方法来指示SQL server再次以第四行为轴心:除非您对行进行排序,否则没有第四行。我在查询中添加了一个CTE以提高性能,因为我的表是一个扩展的SELECT表
ColA                                ColB            ColC
CRDB1901SAUTSVCNSHK021697000001     CRDB1901SAUTSV  CNSHK021697
CRDB1901SAUTSVCNXMN0004666000001    CRDB1901SAUTSV  CNXMN0004666
CRDB1901SAUTSVCNXMN0004683000001    CRDB1901SAUTSV  CNXMN0004683