sql - 如何在这个特定的 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);
从以下关于StackOverflow
(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]
运行此查询时,我的输出为零。我在这里做错了什么?
解决方案
您需要对查询进行一些更改:
- 将所有原始
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];
请注意,我还将表别名从任意字母更改为表名的缩写。这使得查询更容易阅读。
推荐阅读
- android - 我如何确定适合整个屏幕的字符数,我得到正确的屏幕宽度但字符宽度似乎关闭
- javascript - Javascript:将输入放在两个变量之间并输出
- java - 在 JavaFX 中使用 ComboBox 进行多选和取消选择
- haskell - 将存在主义提升到类型级别
- mysql - MYSQL 嵌套查询到 Laravel Eloquent ORM
- soap - 如何通过 SOAP 按位置名称列表搜索 NetSuite 位置
- python - 用逆矩阵不理解这个 AttributeError
- html - 如何填充内容宽度
- python - io.UnsupportedOperation: 寻找
- html - 如何定位没有类或 id 的元素