Как использовать переменную таблицы с этим конкретным запросом T-SQL?

Я использую SQL Server 2012 и у меня есть следующее T-SQL запрос работает с таблицей в моей базе данных. Запрос работает нормально, но моя проблема в том, что я хочу получить выходные данные за несколько конкретных дат. Вместо того, чтобы выполнять запрос несколько раз (путем изменения значения @Date переменная каждый раз), я хотел бы сохранить @Date значения где-то и реализовать логику в моем запросе. Как я могу это сделать?

Мой оригинальный запрос выглядит следующим образом:

DECLARE @Date date;
SET @Date = '20180630';

SELECT @Date, COUNT(*) AS Employees
FROM RavEmpID
WHERE DateOfEntry <= @Date
  AND (DateLeft > @Date
   OR  DateLeft IS NULL);

Из следующего поста Stackru ( SQL Server хранит несколько значений в переменной sql), я понимаю, что мне нужна переменная таблицы для хранения @Date ценности мне нужны.

Итак, я создал переменную таблицы (называется TableVariable) в моей базе данных. TableVariable таблица имеет только один столбец с именем Date следующее:

 Date
 2015-11-30
 2015-12-31
 2016-01-31
 2016-02-29
 ...

Мой новый T-SQL Теперь стоит следующее:

SELECT b.[Date], COUNT(*) AS Employees

FROM RavEmpID a

left join TableVariable b on b.[Date] = a.[DateLeft]

WHERE a.DateOfEntry <= b.[Date]
  AND (a.DateLeft > b.[Date]
   OR  a.DateLeft IS NULL)

GROUP BY b.[Date]

При выполнении этого запроса у меня нулевой вывод. Что я здесь не так делаю?

2 ответа

Решение

Вам нужно внести несколько изменений в ваш запрос:

  • Переместить все свои оригиналы WHERE условия в ON пункт
  • Сделайте таблицу дат первой таблицей в LEFT JOIN потому что вы хотите сохранить все эти даты
  • Измените ``COUNT()`, чтобы он считал совпадения

Результирующий запрос:

SELECT d.[Date], COUNT(r.DateOfEntry) AS Employees
FROM TableVariable d LEFT JOIN
     RavEmpID r
     ON r.DateOfEntry <= d.[Date] AND
        (r.DateLeft > d.[Date] OR r.DateLeft IS NULL)
GROUP BY d.[Date]
GROUP BY d.[Date];

Обратите внимание, что я также изменил псевдонимы таблиц с произвольных букв на сокращения имен таблиц. Это делает запрос намного проще для чтения.

Ваше объединение основано на

 b.[Date] = a.[DateLeft]

Но твое предложение where основано на

 a.DateLeft > b.[Date]

Так что нет логики получать записи. попробуй это:

SELECT b.[Date], COUNT(*) AS Employees

FROM RavEmpID a

inner join TableVariable b on b.[Date] = a.[DateLeft]

WHERE a.DateOfEntry <= b.[Date]
Другие вопросы по тегам