【问题标题】:How to Compare one Column of Table with other Column of other Row in SQL如何在SQL中比较表的一列与另一行的另一列
【发布时间】:2013-09-21 13:29:30
【问题描述】:

我想将一列的值与另一行的另一列进行比较。我尝试使用自加入来完成此操作,但它无法正常工作。有没有有效的方法 在不使用光标的情况下执行此操作。示例表如下所示。我很想知道 Table2 中的 FromDate2 是否位于 Row1 的日期范围 ThruDate1 和 Row2 的 FromDate1 之间。如果它位于,则将第 1 行中的计数更新为 2,因为表 2 中有两行 1 和 2 位于数据范围之间。此外,如果 Table1 中没有第 3 行可取范围,则从 table2 的第 3 行查找 FromDate2 是否 >= 表 1 第 1 行的 ThruDate1。

表1:

Row    MemberID1    FromDate1    ThruDate1        Count 
1         Mem1      01/10/2012   01/12/2012       
2         Mem1      02/01/2012   02/10/2012

表2:

Row       MemberID2  FromDate2    
 1        Mem1         01/14/2012     
 2        Mem1         01/17/2012     
 3        Mem1         02/11/2012 

如果有人能在这个问题上帮助我,我真的很感激。

谢谢, 山姆

【问题讨论】:

  • 当table2中有row3时,你想成为什么计数?

标签: sql sql-server sql-server-2008-r2


【解决方案1】:

如果我理解正确的话,这个查询就可以完成工作:

update Table1 SET Count = 2 
where Row = 1 AND 
EXISTS
(select * from Table2
where FromDate2 Between
(select ThruDate1 from Table1 where Row = 1)
AND
(select FromDate1 from Table1 where Row = 2));

这里是SQLFiddle

【讨论】:

    【解决方案2】:

    我可能误解了,但这就是我认为你想要实现的目标:

    1. 对于Table1 中的每一行,创建一个从ThruDate1[next row with same MemberID1].FromDate1 的范围。
    2. 使用 Table2 中具有相同成员 ID 且位于第 1 步确定的范围之间的行数更新 Count

    但是,我不确定您希望在没有下一行的情况下如何在 Table1 中创建范围。

    不管怎样,here's the example

    WITH data AS (
      SELECT 
        Row,
        (
          SELECT TOP 1 FromDate1
          FROM Table1
          WHERE Row > t1.Row AND MemberID1 = t1.MemberID1
          ORDER BY Row
        ) AS NextDate
      FROM Table1 t1
    )
    UPDATE t1
    SET [Count] = (
        SELECT COUNT(*)
        FROM Table2
        WHERE
          MemberID2 = t1.MemberID1
          AND FromDate2 BETWEEN t1.ThruDate1 AND data.NextDate
    )
    FROM Table1 t1
    INNER JOIN data
      ON t1.Row = data.Row;
    

    【讨论】:

    • 感谢您的回复,但这仅适用于有一行创建范围的计数。但不会计算 table2 中 FromDate2 >= ThruDate1 的那些匹配行。甚至 Table1 Row2 的上述示例计数也应为 1。
    • @KtmGuy 很抱歉,但我只是不明白在 Table1 中没有下一行的情况下应该做什么来使用当前行和下一行值创建一个范围。如果您可以详细解释它,也许以不同的方式,我相信修改当前示例以提供您需要的内容非常简单。
    • 谢谢。对于 table1 中没有行来创建范围的情况,我想我可以使用以下方法更新 [count]。 SELECT COUNT(*) FROM Table2 WHERE MemberID2 = t1.MemberID1 and data.NextDate is null AND FromDate2 BETWEEN t1.ThruDate1 AND '05/30/2013' 对于我的情况,我考虑了日期 5/30/2013。
    • @KtmGuy 这不是一个成熟的解决方案,但是既然你已经在它上面构建了你的解决方案,你有没有考虑过接受我的回答?
    • 谢谢@plalx。是的。我考虑过接受你的回答。
    猜你喜欢
    • 2021-03-26
    • 2020-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-17
    • 1970-01-01
    • 2021-03-06
    相关资源
    最近更新 更多