Условия поиска в нескольких таблицах ВНУТРЕННЕГО СОЕДИНЕНИЯ

#sql #sql-server #tsql

#sql #sql-сервер #tsql

Вопрос:

У меня есть три таблицы:

Клиенты

  ----------- ------------------------- ------------- 
| Client ID | Created                 | Client Type |
 ----------- ------------------------- ------------- 
| 1         | 2020-09-26 17:08:10.000 | Case        |
 ----------- ------------------------- ------------- 
| 2         | 2020-09-26 17:08:11.000 | Case        |
 ----------- ------------------------- ------------- 
| 3         | 2020-09-26 17:08:11.000 | Case        |
 ----------- ------------------------- ------------- 
| 4         | 2020-09-26 17:08:11.000 | Case        |
 ----------- ------------------------- ------------- 
| 7         | 2020-09-27 21:10:14.000 | Case        |
 ----------- ------------------------- ------------- 
  

Оценки

  -------------------------------------- ------------------------- ----------- ----------------- 
| Assessment ID                        | Created                 | Client ID | Assessment Type |
 -------------------------------------- ------------------------- ----------- ----------------- 
| b2b200ec-9725-eb11-a813-00224808102a | 2020-11-13 10:06:49.000 | 6         | Monitoring      |
 -------------------------------------- ------------------------- ----------- ----------------- 
| 5cb200ec-9725-eb11-a813-00224808102a | 2020-11-13 10:06:47.000 | 1         | Monitoring      |
 -------------------------------------- ------------------------- ----------- ----------------- 
| 1ab200ec-9725-eb11-a813-00224808102a | 2020-11-13 10:06:45.000 | 2         | Monitoring      |
 -------------------------------------- ------------------------- ----------- ----------------- 
| c2b100ec-9725-eb11-a813-00224808102a | 2020-11-13 10:06:42.000 | 3         | Monitoring      |
 -------------------------------------- ------------------------- ----------- ----------------- 
| 77b100ec-9725-eb11-a813-00224808102a | 2020-11-13 10:06:41.000 | 5         | Monitoring      |
 -------------------------------------- ------------------------- ----------- ----------------- 
  

Телефонные звонки

  -------------------------------------- ------------------------- ----------- 
| Phone Call ID                        | Created                 | Client ID |
 -------------------------------------- ------------------------- ----------- 
| 34910860-fdd7-ea11-a813-000d3a5a11b0 | 2020-08-06 15:56:27.000 | 0         |
 -------------------------------------- ------------------------- ----------- 
| 5a64b658-fdd7-ea11-a813-000d3a5a11b0 | 2020-08-06 15:56:16.000 | 9         |
 -------------------------------------- ------------------------- ----------- 
| 9a543238-fdd7-ea11-a813-000d3a5a11b0 | 2020-08-06 15:55:21.000 | 2         |
 -------------------------------------- ------------------------- ----------- 
| 2bd93432-fdd7-ea11-a813-000d3a5a11b0 | 2020-08-06 15:55:15.000 | 1         |
 -------------------------------------- ------------------------- ----------- 
| e11c73f8-fcd7-ea11-a813-000d3a5a11b0 | 2020-08-06 15:53:36.000 | 8         |
 -------------------------------------- ------------------------- ----------- 
  

Я хотел бы создать запрос, в котором я получаю только (телефонные звонки за последние 24 часа) И (Клиенты = Обращения) И (Оценки = Мониторинг).

Мой запрос не работает — он получает только клиентов Cases и только оценки мониторинга, но он не получает телефонные звонки только за последние 24 часа. Что я делаю не так? Я действительно ценю помощь.

 SELECT p.[Client ID], COUNT(p.[Phone Call ID]) AS [Phone Calls]
--INTO ##monitoringCasesInterviewAttempts
FROM dbo.vPhonecalls AS p
    INNER JOIN dbo.vAssessments AS a ON (p.[Client ID] = a.[Client ID])
    INNER JOIN dbo.vClients AS c ON (p.[Client ID] = c.[Client ID])
WHERE p.Created >= DATEADD(day, -1, GETDATE())
    AND a.[Assessment Type] = 'Monitoring'
    AND c.[Client Type] = 'Case'
GROUP BY p.[Client ID]
GO
  

Я попытался создать временную таблицу только телефонных звонков за последние 24 часа (ниже), и приведенный выше запрос по-прежнему получает все телефонные звонки. Что-то не так с тем, как я использую СЧЕТЧИК или ГРУППУ?

 SELECT [Phone Call ID], Created, [Client ID]
INTO ##todaysPhoneCalls
FROM dbo.vPhonecalls
WHERE Created >= DATEADD(day, -1, GETDATE())
ORDER BY Created
  

Комментарии:

1. Попробуйте использовать between в Where предложении … и поставьте более раннюю дату перед текущей датой. Вы понимаете, что проверяете дату создания телефонного звонка, которая выглядит как август, и вы не получите никаких обращений.

2. Спасибо @SS_DBA, но я показывал только первые пять результатов. Я убедился, что за последние 24 часа есть строки, и вы заставили меня подумать о создании временной таблицы из них

3. Два вопроса: (1) Какова связь (если таковая имеется) между датами в таблице телефонных звонков и оценок? (2) Не могли бы вы привести пример запроса и его результата? Выглядит крайне странно, что вы получаете вызовы за пределами определенного вами окна. Поскольку вы выбираете столбцы только из таблицы вызовов, закомментируйте внутренние соединения и два AND и посмотрите, получаете ли вы все еще записи вне временного окна (не следует).

4. Пожалуйста, прочтите это для получения нескольких советов по улучшению вашего вопроса. Помогло бы создание рабочего примера, демонстрирующего проблему, например, в SQLFiddle или dbfiddle . (Не забудьте выбрать SQL Server при настройке.) Используйте соответствующее значение вместо GetDate() , например declare @Now as DateTime = '2020-11-13T12:00:00'; , чтобы проблема возникала независимо от того, когда выполняется выборка.

Ответ №1:

Я бы сделал ваше WHERE предложение похожим на это:

 WHERE p.Created >= DATEADD(day, -1, GETDATE())
    AND a.[Assessment Type] = 'Monitoring'
    AND c.[Client Type] = 'Case'
  

Вы можете запустить этот select:

 select DATEADD(day, -1, GETDATE())
  

чтобы посмотреть, что это такое. По сути, он выдает вам временную метку за 24 часа назад.

Комментарии:

1. Спасибо Кейси. Когда я запускаю select DATEADD(day, -1, GETDATE()) , он получает последние 24 часа. К сожалению, запрос по-прежнему не работает, он по-прежнему получает все телефонные звонки. Я создал еще одну таблицу ТОЛЬКО сегодняшних телефонных звонков, а затем попробовал это в приведенном выше запросе, и это ВСЕ равно не сработало. Как он считает телефонные звонки в таблице, к которой он даже не запрашивает? Мой СЧЕТ или ГРУППА неверны? SELECT [Phone Call ID], Created, [Client ID] --INTO ##todaysPhoneCalls FROM dbo.vPhonecalls WHERE Created >= DATEADD(day, -1, GETDATE()) ORDER BY Created

2. Вы хотите сказать, что этот запрос: SELECT * FROM vPhonecalls WHERE Created >= DATEADD(day, -1, GETDATE()) получает все вызовы, даже те, которые старше 24 часов? Кроме того, vPhonecalls это представление или таблица?

3. В том-то и дело, что вышеприведенный оператор SELECT ДЕЙСТВИТЕЛЬНО РАБОТАЕТ! ха-ха. vPhonecalls — это представление

4. Я здесь заблудился. Я больше не уверен, в чем ваша проблема. Кроме того, если у вас нет ДЕЙСТВИТЕЛЬНО веской причины использовать представления (а у вас, вероятно, их нет), я бы их не использовал.

5. Еще раз спасибо! Я действительно ценю помощь. Я рад, что синтаксис правильный. Я попробую еще раз с таблицами и отчитаюсь