【问题标题】:SQL: how to transpose rows into columns (another approach needed)SQL:如何将行转换为列(需要另一种方法)
【发布时间】:2019-12-26 08:27:57
【问题描述】:

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

但是,所提供的解决方案依赖于“枢轴”,它是某种 ID 列。如果我没有 ID 怎么办,而且我也不一定想通过使用ROW_NUMBER() 创建一个 ID 来减慢查询速度。

样本数据:

MyDataColumn
CRDB1901SAUTSVCNXMN0004666000001
CRDB1901SAUTSV
CNXMN0004666
CRDB1901SAUTSVCNXMN0004683000001
CRDB1901SAUTSV
CNXMN0004683
CRDB1901SAUTSVCNSHK021697000001
CRDB1901SAUTSV
CNSHK021697

唯一给定的是我的列中存在三个不同值的模式。所以每第四行重复转置。我想要这个。。

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;

【问题讨论】:

  • 关系数据库中的行没有定义的排序顺序。没有“第四行”之类的东西,除非你有一些列可以用于order by
  • @a_horse_with_no_name 添加了标签 - SQL 服务器。我正在查看 PIVOT 功能。必须有一种方法可以“指示” SQL Server 以第 4 行为轴
  • 再说一遍:没有像“第 4 行”这样的东西除非你有东西可以对这些行进行排序。

标签: sql-server multiple-columns rows transpose


【解决方案1】:

您可以尝试如下自行加入。如果我猜对了,COLA 的第一部分是 COLB,COLA 的中间部分是 COLC,最后 COLA 的最后一部分是序列号。如果上述逻辑始终为 TRUE,则以下脚本应该可以满足您的目的。

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

【讨论】:

  • 我在您的查询中添加了一个 CTE 以提高性能,因为我的表是一个扩展的 SELECT
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-03
  • 1970-01-01
  • 2020-09-26
相关资源
最近更新 更多