如果 id 不存在于另一个表中,则根据条件使用 sql 计算 id 的编号
Posted
技术标签:
【中文标题】如果 id 不存在于另一个表中,则根据条件使用 sql 计算 id 的编号【英文标题】:Count the no of id if it is not present in another table based on condition using sql 【发布时间】:2013-05-08 13:24:13 【问题描述】:我有一个包含 RepId 及其日期的表格。
Table: 1
RepID Date
108981 2013-04-09 00:00:00.000
108981 2013-04-09 00:00:00.000
108982 2013-04-10 00:00:00.000
108982 2013-04-11 00:00:00.000
108983 2013-04-11 00:00:00.000
108983 2013-04-11 00:00:00.000
我有另一个表,其中包含 RepId 和它们的 logTime。
Table: 2
repID logTime
108981 2013-04-09 00:00:00.000
108981 2013-04-09 00:00:00.000
108982 2013-04-11 00:00:00.000
108983 2013-04-11 00:00:00.000
108983 2013-04-11 00:00:00.000
108984 2013-04-10 00:00:00.000
当表 2 中的代表不存在日志时间时,我想要表 1 中的 RepId 计数。
在这种情况下,我需要输出为
repId RepCount
108982 1
因为 RepId - 108982 的表 2 中不存在日期“2013-04-10 00:00:00.000”。
我已将查询用作
select
t1.RepID, count(t1.RepID) as 'Rep Count'
from
table1 t1
where
not exists
(select t2.repID from table2 t2 where
CONVERT(date, t2.logTime) between '2013-04-08 00:00:00.000' and '2013-04-11 00:00:00.000')
group by
t1.RepID
但它总是什么也不返回。请帮助解决这个问题....
【问题讨论】:
没有主键?这两个表都有重复的行。 【参考方案1】:您可以在此处使用 LEFT OUTER JOIN。
SELECT
t1.repID, COUNT(t1.repID)
FROM
table1 t1
LEFT OUTER JOIN
table2 t2
ON
t1.repID = t2.repID
AND
t1.Date = t2.logTime
WHERE
t2.repID IS NULL
GROUP BY
t1.repID
【讨论】:
【参考方案2】:我想你想表达为not in
:
select t1.RepID, count(t1.RepID) as 'Rep Count'
from table1 t1
where t1.repid not in (select t2.repID
from table2 t2
where CONVERT(date, t2.logTime) between '2013-04-08 00:00:00.000' and '2013-04-11 00:00:00.000'
)
group by t1.RepID
或者使用相关子查询或left outer join
。
您的查询的问题是您正在寻找在此期间 any 记录的存在(或不存在),并且必须存在。您确实想查找给定 repId 的记录。
【讨论】:
【参考方案3】:问题在于您没有将 not exists 中的子查询与外部查询相关联,因此 not exists 子句始终返回 false。试试这样的:
select
t1.RepID, count(t1.RepID) as 'Rep Count'
from
table1 t1
where
not exists
(select t2.repID from table2 t2 where t2.repId = t1.repId and
CONVERT(date, t2.logTime) between '2013-04-08 00:00:00.000' and '2013-04-11 00:00:00.000')
group by
t1.RepID
【讨论】:
【参考方案4】:select
t1.RepID, count(t1.RepID) as 'Rep Count'
from
table1 t1
where
not exists
(select * from table2 t2 where
t2.RepID = t1.RepID and t2.LogTime = t1.Date)
group by
t1.RepID
SQLFiddle Demo
【讨论】:
【参考方案5】:between 将涵盖给定的开始和结束日期以及table2 logtime
2013-04-11 00:00:00.000 将处于介于两者之间的条件,这就是您没有获得任何记录的原因
你应该使用r.RepId not in
看这个演示,SQLFiddle DEMO
您使用 > 和
select
t1.RepID, count(t1.RepID) as 'Rep Count'
from
table1 t1
where t1.RepID
not in
(select t2.repID from table2 t2 where
t2.logTime > '2013-04-08 00:00:00.000' and t2.logTime < '2013-04-11 00:00:00.000')
group by
t1.RepID
或者你的结果是正确的 更改您的 table2 值
108982, '2013-04-11 01:00:00.000'
select
t1.RepID, count(t1.RepID) as 'Rep Count'
from
table1 t1
where t1.RepID
not in
(select t2.repID from table2 t2 where
t2.logTime between '2013-04-08 00:00:00.000' and '2013-04-11 00:00:00.000')
group by
t1.RepID
【讨论】:
以上是关于如果 id 不存在于另一个表中,则根据条件使用 sql 计算 id 的编号的主要内容,如果未能解决你的问题,请参考以下文章
Google Script:如果行中的值存在于另一个工作表中,则删除行