Подсчитайте номер идентификатора, если он отсутствует в другой таблице, на основе условия с использованием sql

У меня есть таблица, состоящая из 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

Мне нужен подсчет RepId из таблицы 1, когда время журнала не существует для этого представителя из таблицы 2.

В этом случае мне нужен вывод как

repId       RepCount
108982      1

поскольку дата «2013-04-10 00:00:00.000» не существует в таблице 2 для RepId — 108982.

Я использовал запрос как

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

но он всегда ничего не возвращает. Помогите пожалуйста избавиться от этой проблемы....


person Renuka    schedule 08.05.2013    source источник
comment
Нет первичных ключей? Обе эти таблицы имеют повторяющиеся строки.   -  person Mike Sherrill 'Cat Recall'    schedule 08.05.2013


Ответы (5)


Здесь вы можете использовать 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
person James Osborn    schedule 08.05.2013

Я думаю, вы хотите выразить это как 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.

Проблема с вашим запросом заключается в том, что вы ищете наличие (или отсутствие) какой-либо записи за этот период, а она должна существовать. Вы действительно хотите найти запись для данного repId.

person Gordon Linoff    schedule 08.05.2013

Проблема в том, что вы не связываете подзапрос в не существует с внешним запросом, поэтому предложение не существует всегда возвращает 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
person dang    schedule 08.05.2013

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

person Nenad Zivkovic    schedule 08.05.2013

между также будет охватывать заданную дату начала и окончания в 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

или ваш результат правильный, измените значение таблицы2

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
person HaBo    schedule 08.05.2013