我正在尝试从表中选择列val的子集,其中子集在一个时间范围内,并且该行的索引值也为23。我目前正在使用CASE来指定Index = 23和DateAndTime应该等于几天的计数变量(d @ daycnt)和小时的计数变量@hourcnt。
SELECT
CASE WHEN Index=23
AND DATEPART(DAYOFYEAR,DateAndTime)=@daycnt
AND DATEPART(HOUR,DateAndTime)=@hourcnt THEN Val END
FROM Table
使用上面的代码时,我选择整个列Val。我一直试图在THEN之后添加一个where条件,以指定我想要的Val子集,如下所示:
SELECT
CASE WHEN Index=23
AND DATEPART(DAYOFYEAR,DateAndTime)=@daycnt
AND DATEPART(HOUR,DateAndTime)=@hourcnt THEN Val WHERE
Index=23
AND DATEPART(DAYOFYEAR,DateAndTime)=@daycnt
AND DATEPART(HOUR,DateAndTime)=@hourcnt END
FROM Table
但这似乎不起作用。有谁知道如何在THEN之后指定列的子集。
感谢您的帮助。
答案 0 :(得分:0)
使用case语句将为您提供所有行的结果,但是Val仅在满足您的CASE
条件时显示。
更新:您说过,您希望根据您的条件将值显示在其他列中。这可以用CASE或UNION完成。我认为UNION更易于阅读和解决。我将展示两种解决方案,让您决定。
听起来您只想包含匹配的行。如果这是您想要的,请不要使用CASE
。而是将过滤器放在WHERE
子句中。
示例数据:
Index Val DateAndTime
----- --- -----------------
5 6 9/24/2018 10:01
9 1 9/24/2018 10:01
23 9 9/24/2018 10:01
23 12 9/24/2018 10:01
25 4 9/24/2018 10:01
您使用CASE
进行的查询:
SELECT Index,
CASE Index WHEN 5 THEN Val ELSE NULL END AS Col1,
CASE Index WHEN 9 THEN Val ELSE NULL END AS Col2,
CASE Index WHEN 23 THEN Val ELSE NULL END AS Col3,
CASE Index WHEN 25 THEN Val ELSE NULL END AS Col4,
DateAndTime
FROM Table
WHERE DATEPART(DAYOFYEAR,DateAndTime)=@daycnt
AND DATEPART(HOUR,DateAndTime)=@hourcnt
给出以下结果:
Index Col1 Col2 Col3 Col4 DateAndTime
----- ---- ---- ---- ---- -----------------
5 6 null null null 9/24/2018 10:01
9 null 1 null null 9/24/2018 10:01
23 null null 9 null 9/24/2018 10:01
23 null null 12 null 9/24/2018 10:01
25 null null null 4 9/24/2018 10:01
尝试在WHERE
子句和UNION
语句中使用过滤器进行此查询,以将其收集为一个查询结果:
SELECT Index, Val AS Col1, NULL AS Col2, NULL AS Col3, NULL AS Col4, DateAndTime
FROM Table
WHERE Index=5 --First row is in Col1
AND DATEPART(DAYOFYEAR,DateAndTime)=@daycnt
AND DATEPART(HOUR,DateAndTime)=@hourcnt
UNION
SELECT Index, NULL AS Col1, Val AS Col2, NULL AS Col3, NULL AS Col4, DateAndTime
FROM Table
WHERE Index=9 --2nd row is in col 2
AND DATEPART(DAYOFYEAR,DateAndTime)=@daycnt
AND DATEPART(HOUR,DateAndTime)=@hourcnt
UNION
SELECT Index, NULL AS Col1, NULL AS Col2, Val AS Col3, NULL AS Col4, DateAndTime
FROM Table
WHERE Index=23 --row 3 and 4 are in Col 3
AND DATEPART(DAYOFYEAR,DateAndTime)=@daycnt
AND DATEPART(HOUR,DateAndTime)=@hourcnt
UNION
SELECT Index, NULL AS Col1, NULL AS Col2, NULL AS Col3, Val AS Col4, DateAndTime
FROM Table
WHERE Index=25
AND DATEPART(DAYOFYEAR,DateAndTime)=@daycnt
AND DATEPART(HOUR,DateAndTime)=@hourcnt
要产生此结果(与第一个查询相同):
Index Col1 Col2 Col3 Col4 DateAndTime
----- ---- ---- ---- ---- -----------------
5 6 null null null 9/24/2018 10:01
9 null 1 null null 9/24/2018 10:01
23 null null 9 null 9/24/2018 10:01
23 null null 12 null 9/24/2018 10:01
25 null null null 4 9/24/2018 10:01
您提到您想做一个INSERT
。 CASE
查询的语法非常相似。只需将INSERT
语句放在您的CASE
查询之前。但是,如果您想坚持使用UNION
语法,我仍然认为查询将更易于解决,因为您可以将其分为4个单独的INSERT
查询,而不是一个INSERT
大UNION
查询。