SQL:如何将行转置为列(需要另一种方法)
SQL: how to transpose rows into columns (another approach needed)
类似问题有一个很好的答案
但是,所提供的解决方案依赖于 "pivot",它是某种 ID 列。如果我没有 ID,而且我也不一定想通过使用 ROW_NUMBER()
创建一个 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
上遇到 "cannot be bound" 错误
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;
您可以尝试自行加入,如下所示。如果我猜对了,COLA 的第一部分是 COLB,COLA 的中间部分是 COLC,最后 COLA 的最后部分是序列号。如果以上逻辑始终为真,则以下脚本应该可以满足您的目的。
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
输出是-
ColA ColB ColC
CRDB1901SAUTSVCNSHK021697000001 CRDB1901SAUTSV CNSHK021697
CRDB1901SAUTSVCNXMN0004666000001 CRDB1901SAUTSV CNXMN0004666
CRDB1901SAUTSVCNXMN0004683000001 CRDB1901SAUTSV CNXMN0004683
类似问题
但是,所提供的解决方案依赖于 "pivot",它是某种 ID 列。如果我没有 ID,而且我也不一定想通过使用 ROW_NUMBER()
创建一个 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
上遇到 "cannot be bound" 错误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;
您可以尝试自行加入,如下所示。如果我猜对了,COLA 的第一部分是 COLB,COLA 的中间部分是 COLC,最后 COLA 的最后部分是序列号。如果以上逻辑始终为真,则以下脚本应该可以满足您的目的。
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
输出是-
ColA ColB ColC
CRDB1901SAUTSVCNSHK021697000001 CRDB1901SAUTSV CNSHK021697
CRDB1901SAUTSVCNXMN0004666000001 CRDB1901SAUTSV CNXMN0004666
CRDB1901SAUTSVCNXMN0004683000001 CRDB1901SAUTSV CNXMN0004683