如何在这个特定的 T-SQL 查询中使用 Table 变量?
How to use a Table Variable with this specific T-SQL query?
我正在使用 SQL Server 2012
并且我有以下 T-SQL
查询 运行 针对我的数据库中的 table。查询运行良好,但我的问题是我想获得几个特定日期的输出。而不是多次 运行 查询(通过每次更改 @Date
变量的值),我希望它将 @Date
值存储在某处并在我的查询中实现逻辑。我该怎么做?
我原来的Query如下:
DECLARE @Date date;
SET @Date = '20180630';
SELECT @Date, COUNT(*) AS Employees
FROM RavEmpID
WHERE DateOfEntry <= @Date
AND (DateLeft > @Date
OR DateLeft IS NULL);
从下面的post on Whosebug
(SQL Server store multiple values in sql variable),我了解到我需要一个Table变量来存储我需要的@Date
值.
所以,我在我的数据库上创建了一个 Table 变量(称为 TableVariable
)。
TableVariable
table 只有一列名为 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]
当运行这个查询时,我的输出为零。我在这里做错了什么?
您的加入基于
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]
您需要对查询进行一些更改:
- 将所有原始
WHERE
条件移动到 ON
子句中
- 将日期 table 设为 第一个 table 在
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];
请注意,我还将 table 别名从任意字母更改为 table 名称的缩写。这使得查询更容易阅读。
我正在使用 SQL Server 2012
并且我有以下 T-SQL
查询 运行 针对我的数据库中的 table。查询运行良好,但我的问题是我想获得几个特定日期的输出。而不是多次 运行 查询(通过每次更改 @Date
变量的值),我希望它将 @Date
值存储在某处并在我的查询中实现逻辑。我该怎么做?
我原来的Query如下:
DECLARE @Date date;
SET @Date = '20180630';
SELECT @Date, COUNT(*) AS Employees
FROM RavEmpID
WHERE DateOfEntry <= @Date
AND (DateLeft > @Date
OR DateLeft IS NULL);
从下面的post on Whosebug
(SQL Server store multiple values in sql variable),我了解到我需要一个Table变量来存储我需要的@Date
值.
所以,我在我的数据库上创建了一个 Table 变量(称为 TableVariable
)。
TableVariable
table 只有一列名为 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]
当运行这个查询时,我的输出为零。我在这里做错了什么?
您的加入基于
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]
您需要对查询进行一些更改:
- 将所有原始
WHERE
条件移动到ON
子句中 - 将日期 table 设为 第一个 table 在
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];
请注意,我还将 table 别名从任意字母更改为 table 名称的缩写。这使得查询更容易阅读。