Как использовать переменную таблицы с этим конкретным запросом 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]