获取另一个表的一部分中不存在的行

时间:2013-02-22 13:35:01

标签: sql sql-server-2005

我在table1中的数据看起来像这样:

  DateMonthID    SubscriberID    othercolumns...
     201201           106
     201201           207
     201202           309
     201203           405
     201203           297

等等

和table2如此:

  DateMonthID    SubscriberID    Level
       ...           ...          1
       ...           ...          2
       ...           ...          1
       ...           ...          3
       ...           ...          2

等等

我需要做的是检查第一个表中哪些订阅者在将来的3个月内不存在于另一个表中。这有意义吗?

示例:将表中的subscriberID 106作为日期201201(1月)。如果它没有出现在201201-201204(1月至4月)的另一张表中,我需要累计一次。

这是我到目前为止所做的,但它似乎返回了太多的值:

SELECT
    COUNT(1) AS Total,
    table1.month_key,
    table2.level
FROM
    dbo.table1
INNER JOIN
    dbo.table2 ON (table2.subscriber_id = table1.subscriber_id)
WHERE
    NOT EXISTS (SELECT * FROM table2
                WHERE
                (table2.month_key >= table1.month_key AND table2.month_key <= (table1.month_key + 3))
                AND table2.subscriber_id = table1.subscriber_id)
GROUP BY
table1.month_key, table2.level
ORDER BY
table2.level, table1.month_key

非常感谢任何帮助

--------------编辑-------------- 只是为了让事情更清楚,因为我不确定我是否正在解释它。情况是在表1中是停止订阅的人和他们停止订阅的日期。事情是这可能不是真的,也许他们只是改变了订阅或一个月后重新订阅。表2是每个月的订户表。我需要找出谁真正取消订阅,通过检查它们是否出现在表2中的日期表1表示他们取消订阅然后接下来的3个月。希望这会有所帮助。

1 个答案:

答案 0 :(得分:2)

我认为问题在于您无法在月份键中添加“3”以获得所需内容。试试这个:

FROM (select table1.*,
             (cast(left(month_key, 4) as int)*12+
                                cast(right(month_key, 2) as int)
                               ) as newMonthKey
      from dbo.table1
     ) table1
. . .

where not exists (select 1
                  from (select table2.*,
                               (cast(left(month_key, 4) as int)*12+
                                cast(right(month_key, 2) as int)
                               ) as newMonthKey
                        from table2
                       ) t
                  where (t.newmonthkey >= table1.newmonthkey AND t.newmonthkey <= (table1.newmonthkey + 3))
                        AND t2.subscriber_id = table1.subscriber_id
                       )

这会将月份密钥更改为自0年以来的月份计数器。