Sql 获取在另一个表的某个部分中不存在的行
表1中的数据如下所示:Sql 获取在另一个表的某个部分中不存在的行,sql,sql-server-2005,Sql,Sql Server 2005,表1中的数据如下所示: DateMonthID SubscriberID othercolumns... 201201 106 201201 207 201202 309 201203 405 201203 297 等等等等 如表2所示: DateMonthID SubscriberID Level
DateMonthID SubscriberID othercolumns...
201201 106
201201 207
201202 309
201203 405
201203 297
等等等等
如表2所示:
DateMonthID SubscriberID Level
... ... 1
... ... 2
... ... 1
... ... 3
... ... 2
等等等等
我需要做的是检查第一个表中的哪些订户在未来3个月内不存在于另一个表中。这有意义吗
示例:以表中的subscriberID 106为例,日期为2011年1月。如果在201201-2012041年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列出了每个月的订户。我需要通过检查他们是否在表1所示的退订日期和接下来的3个月之间出现在表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年起将monthkey更改为月份计数器。什么是月份键?这是六位数的DateMonthID,还是其他什么?那么,您的输出需要是什么样的?输出需要是Total,MonthID,Level。因此,每个级别的每个月的总数在表1中显示了每个月的订户数量,而在表2中,在接下来的3个月中,订户数量不存在。因此,它当前返回的值在表2中,在接下来的3个月中确实存在?啊,您是正确的,您还帮助我注意到了另一个潜在问题,即我的表2数据只有2012年的数据,这意味着10月至11月,尤其是12月的订阅者比表2中的要少。所以本质上我需要做的就是添加一个和表1.month_key我很抱歉我很快就和你谈过了,问题是随着月份的推移,总数越来越大,以至于在结果中,到第二个月时,给定月份的所有总数都高于表1中该月的订户数。@Weebl。也许你的外部连接需要在monthid上连接以及用户id。我没有外部连接…我需要外部连接吗?我对SQL还是相当陌生,虽然我知道哪些连接是我不太熟悉的,但我不知道什么时候使用哪个连接。