如何根据SQL Server中的一个列值合并两个不同的行?

时间:2015-08-07 12:48:14

标签: sql-server

我有一个返回结果的结果集,

   ID     Q_Number      INC_Date1       INC_Date2             OUT_Date1        OUT_Date2
--------------------------------------------------------------------------------------
8322445  Q8322445  2014-03-06 00:00:00  2014-05-14 13:31:00    NULL          NULL
8322445  Q8322445         NULL            NULL           2014-05-16 09:22:00  2014-05-20 07:29:00

实际上我想获得所有列之间的日期差异。

它适用于INC_Date 2和INC_Date1,OUT_Date2和OUT_Date1之间的区别,但它不适用于OUT_Date1 - INC_Date2。

我不确定整个牌桌的最大日期是否合适。

以下是我想要的输出示例

ID     Q_Number      INC1INC2Diff       INC2OUT1Diff         OUT1OUT2Diff 
----------------------------------------------------------------------------
8322445  Q8322445       69                 1                    3

我该怎么做?

3 个答案:

答案 0 :(得分:0)

如果没有看到您的查询,这是一个猜测,但要合并示例中的行,您可以使用这样的聚合:

select 
    ID, 
    Q_Number,       
    max(INC_Date1) as INC_Date1,
    max(INC_Date2) as INC_Date2,
    max(OUT_Date1) as OUT_Date1,
    max(OUT_Date2) as OUT_Date2
from 
    table -- or from your query used as a derived table
group by 
    id, Q_Number

更新问题中的更改:

select 
    ID, 
    Q_Number,       
    DATEDIFF(d,max(INC_Date1), max(INC_Date2) ) as INC1INC2Diff,
    DATEDIFF(d,max(INC_Date2), max(OUT_Date1) ) as INC2OUT1Diff,
    DATEDIFF(d,max(OUT_Date1), max(OUT_Date2) ) as OUT1OUT2Diff
from 
    t
group by 
    id, Q_Number

答案 1 :(得分:0)

如果你总是知道

  • 某些行在INC日期1和2中始终具有日期,并且在OUT日期1和2
  • 中始终为NULL
  • 某些行在OUT日期1和2中始终具有日期,并且在OUT日期1和2
  • 中始终为NULL
  • 您将始终拥有匹配的'这些行

你可以用ID和/或Q_Number上的INNER JOIN做一个简单的SELECT,具体取决于你的键选择NON NULL值。

答案 2 :(得分:0)

在不使用SP和游标的情况下,您似乎应该执行两个步骤(尽管如果需要,它可能是一个原子事务。注意:如果第二个没有问题,请不要在一个事务中执行这两个步骤命令不成功,而是再试一次。)

  1. 使用相关子查询进行更新。相关性转到子查询的WHERE,它是内部和外部查询的相等Q_Number
  2. 删除无用剩余的删除(UPDATE后仍然包含NULL的行)