sql - 使用 CASE WHEN 将数字列表添加到查询中
问题描述
是否可以在下面的查询中添加数字列表:
DECLARE @MONTHS NVARCHAR(10)
DECLARE @YEAR NVARCHAR(10)
BEGIN
SET @MONTHS = 'Q1'
SET @YEAR = '2017'
SELECT *
FROM netlication.dbo.iehResults
WHERE DATEPART(yyyy,COLLDATE) = CAST(@YEAR AS INT)
AND DATEPART(mm,collDate) IN (CASE @MONTHS WHEN 'Q1' THEN '1' End)
END
上面的查询工作正常,但对于值 Q1 我希望能够传递数字 1,2 和 3 的列表
所以我试着做:
AND DATEPART(mm, collDate) IN (CASE @MONTHS WHEN 'Q1' THEN '1,2,3' End)
但我得到一个转换错误:
消息 245,级别 16,状态 1,第 9
行将 varchar 值“1,2,3”转换为数据类型 int 时转换失败。
解决方案
而不是DATEPART(mm,collDate)
您可以使用DATEPART(q,collDate)
which 将返回季度,您不需要与 3 个值进行比较。但要比较,您必须使用between
and 2case
语句。
DECLARE @MONTHS NVARCHAR(10)
DECLARE @YEAR NVARCHAR(10)
BEGIN
SET @MONTHS = 'Q1'
set @YEAR = '2017'
SELECT * FROM netlication.dbo.iehResults
WHERE DATEPART(yyyy,COLLDATE) = CAST(@YEAR AS INT)
AND DATEPART(q,collDate) = (CASE @MONTHS WHEN 'Q1' THEN 1 WHEN 'Q2' THEN 2 WHEN 'Q3' THEN 3 WHEN 'Q4' THEN 4 End)
END
但是,在性能方面,最好计算季度的开始日期和结束日期,然后按它们之间的 COLLDATE 进行过滤:
set @StartDate = DATEFROMPARTS(@YAR, CASE @MONTHS
WHEN 'Q1' THEN 1
WHEN 'Q2' THEN 4
WHEN 'Q3' THEN 7
WHEN 'Q4' THEN 10 End, 1)
set @EndDate = DATEADD(q, 1, @StartDate)
SELECT * FROM netlication.dbo.iehResults
WHERE COLLDATE >= @StartDate and COLLDATE < @EndDate
推荐阅读
- clojure - 并列换能器
- javascript - 我尝试使用此解决方案将二进制数转换为句子“篝火不好玩吗!?” 但在这句话出现'未定义'之前。怎么能去掉这个?
- spring - 为什么使用 @Autowired 不会导致循环依赖,但自动装配构造函数会?
- ios - DanielGindi 图表,增加图表和图例之间的底部空间。iOS 斯威夫特
- python-3.x - 在 Python 中使用 Alpha Vantage 编写一个简单的股票预测服务。我收到这个错误
- loops - 使用“for x in range()”获取迭代结果
- r - 将具有不同长度的数据帧的嵌套列表转换为 R 中的一个数据帧
- java - 单元测试服务层上的 AssertionError(在 Java 中使用 Spring)
- c++ - 与线程数受限的同步服务器相比,grpc 异步服务器是否具有更好的性能?
- sql-server - T-sql While 循环为电子邮件创建 html 代码。如何在此循环中动态更改表名和变量名?