【问题标题】:Move one row value to another in SQL在 SQL 中将一个行值移动到另一个
【发布时间】:2014-03-06 13:52:10
【问题描述】:

我目前有一个这样的临时表

DBName API50 CounterValue
NULL    NULL   1
test1   34.5   NULL
NULL    NULL   2
test1   38.5   NULL

我想要一个脚本来制作我的临时表,如下所示

DBName API50 CounterValue
test1   34.5   1
test1   38.5   2

【问题讨论】:

  • 你怎么知道countervalue 2属于API50值38.5?另外,您使用的是哪个 DBMS?后格雷斯?甲骨文?
  • 好问题@a_horse_with_no_name!我猜这里使用了一些隐含的顺序,他想合并连续的行。
  • 大家好,我使用的是 SQL Server 2008。计数器值始终排在第一位,因此它将适用于计数值为空的下一行。希望这能回答您的问题。

标签: sql sql-server-2008 temp-tables


【解决方案1】:

如果您的表有一个主键,并且您总是希望将 CounterValue 字段与表中的下一个字段相关联,您可以进行自联接:

SELECT t1.DBName, t1.API50, t2.CounterValue
FROM MyTable t1 INNER JOIN MyTable t2 ON t1.PrimaryKey -1 = t2.PrimaryKey
WHERE t1.DBName IS NOT NULL

【讨论】:

  • 好答案!如果该表除了显示的三列之外确实没有其他列,则可以向现有表添加一个新列以提供此功能。这似乎值得付出努力。
  • @SebastianH,我刚刚注意到他说他正在使用临时表:向其中添加密钥应该不会太难。好主意。
  • 这是一个完美的解决方案。真的非常感谢你。它有效!。
  • 嗨,我已经使用了上面的脚本,它工作正常,但是如果计数器值在最后一行一直为空,则会被删除。我在下面的问题中进一步解释了。 stackoverflow.com/questions/23626096/…
【解决方案2】:

我喜欢 AHiggins 的回答,因为它解决了 SQL 中的问题,这可能是预期的。但是,当我读到您的问题时,最初困扰我的是:为什么要在 SQL 中解决它? 似乎数据最初不是在数据库中创建的,而是以某种方式导入的。 如果我是正确的 - 或者如果导出表格、编辑和重新导入 - 是一个选项,那么您可以使用正则表达式来解决这个问题。所有著名的文本编辑器都可以为您执行此操作(我使用 NotePad++ 进行了测试)。

如果表格位于使用制表符 \t 作为分隔符的文本文件中,您可以简单地替换所有

NULL\tNULL\t(.*)\n(.*)\t(.*)\tNULL

\2\t\3\t\1.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-15
    • 2019-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-18
    • 1970-01-01
    • 2021-11-03
    相关资源
    最近更新 更多