SQL:案例 - 不显示记录 WHERE NULL



我的任务是想出一种翻译以下数据的方法:

保存在 [HappenedAtUtc]中的 FROM 日期如下所示:

2016-11-19 10:35:13.5790000
2016-12-21 12:16:58.5080000
2017-01-13 12:16:58.5080000
2017-01-13 12:16:58.5080000
2017-02-13 12:16:58.5080000
2017-03-13 12:16:58.5080000
2017-04-01 12:16:58.5080000
2017-04-02 18:11:53.3090000
.
.
.

TO仅过滤所有记录的最后3 个月,格式为:"yyyy-MM">...//我不知道当月!(2017-04)

我已经写了一些代码:

SELECT
Format([OccuredAtUtc], 'yyyy-MM') AS 'Temp', -- temporary column to show, how original dates look like
CASE WHEN ( Format([OccuredAtUtc], 'yyyy-MM') = Format((DATEADD(MM, -1, GETDATE())), 'yyyy-MM') ) THEN Format([OccuredAtUtc], 'yyyy-MM')
WHEN ( Format([OccuredAtUtc], 'yyyy-MM') = Format((DATEADD(MM, -2, GETDATE())), 'yyyy-MM') ) THEN Format([OccuredAtUtc], 'yyyy-MM')
WHEN ( Format([OccuredAtUtc], 'yyyy-MM') = Format((DATEADD(MM, -3, GETDATE())), 'yyyy-MM') ) THEN Format([OccuredAtUtc], 'yyyy-MM')
ELSE NULL
END AS 'Time'
FROM @TABLE
WHERE ( 'Time' IS NOT NULL )
--WHERE ( [OccuredAtUtc] NOT LIKE '2017-04%' ) AND ( [OccuredAtUtc] NOT LIKE '2016-12%' ) AND ( [OccuredAtUtc] NOT LIKE '2016-11%' )
GROUP BY Format([OccuredAtUtc], 'yyyy-MM')
ORDER BY [Time] ASC

>>>OUTPUT:

__Temp__|_Time__
2016-12 | NULL
2017-04 | NULL
2016-11 | NULL
2017-01 | 2017-01
2017-02 | 2017-02
2017-03 | 2017-03

[Temp] 列仅用于显示带有 NULL 的单元格后面的数据

我需要删除所有行,[时间] 列中的 NULL 在哪里。如您所见,代码中的 WHERE 条件不起作用,可能是数据格式存在问题?我不知道为什么它不听"时间":(

PS:如果我使用按列表手动过滤 [发生AtUtc] 中的月份的 comented WHERE ,它可以工作。但是我不能通过编写合适的月份列表来手动更改每个月查询

PS2:我不想使用任何@variable方法,因为 SSRS 中的数据集不能很好地与它们配合使用。筛选过去 3 个月的数据(不包括当前月份)的简单查询。

还是有办法怎么说...嘿,CASE,如果发生其他情况,请不要 显示线条?

提前谢谢你!!!

您将无法在 where 子句中引用"Time"列别名。

尝试使用子查询或 cte。

SELECT *
FROM (
SELECT
Format([OccuredAtUtc], 'yyyy-MM') AS 'Temp', -- temporary column to show, how original dates look like
CASE WHEN ( Format([OccuredAtUtc], 'yyyy-MM') = Format((DATEADD(MM, -1, GETDATE())), 'yyyy-MM') ) THEN Format([OccuredAtUtc], 'yyyy-MM')
WHEN ( Format([OccuredAtUtc], 'yyyy-MM') = Format((DATEADD(MM, -2, GETDATE())), 'yyyy-MM') ) THEN Format([OccuredAtUtc], 'yyyy-MM')
WHEN ( Format([OccuredAtUtc], 'yyyy-MM') = Format((DATEADD(MM, -3, GETDATE())), 'yyyy-MM') ) THEN Format([OccuredAtUtc], 'yyyy-MM')
ELSE NULL
END AS 'Time'
FROM @TABLE
--WHERE ( 'Time' IS NOT NULL )
--WHERE ( [OccuredAtUtc] NOT LIKE '2017-04%' ) AND ( [OccuredAtUtc] NOT LIKE 
'2016-12%' ) AND ( [OccuredAtUtc] NOT LIKE '2016-11%' )
GROUP BY Format([OccuredAtUtc], 'yyyy-MM'))s
WHERE Time IS NOT NULL
ORDER BY [Time] ASC

这是因为 SQL 查询的操作顺序:

1. FROM clause
2. WHERE clause
3. GROUP BY clause
4. HAVING clause
5. SELECT clause
6. ORDER BY clause

"WHERE"子句在"SELECT"子句之前计算。

'Time' 是一个永远不会为空的文本字符串。它的行说"JoeC"在哪里为空。这是因为不能在 where 子句中使用 ' 来表示字段名称。 您可以使用[时间],时间或"时间"。

编辑 不能在 where 子句中使用别名。 您需要重复代码或使用子查询/CTE:

With cteQry As
(
SELECT
Format([OccuredAtUtc], 'yyyy-MM') AS Temp, -- temporary column to show, how original dates look like
CASE WHEN ( Format([OccuredAtUtc], 'yyyy-MM') = Format((DATEADD(MM, -1, GETDATE())), 'yyyy-MM') ) THEN Format([OccuredAtUtc], 'yyyy-MM')
WHEN ( Format([OccuredAtUtc], 'yyyy-MM') = Format((DATEADD(MM, -2, GETDATE())), 'yyyy-MM') ) THEN Format([OccuredAtUtc], 'yyyy-MM')
WHEN ( Format([OccuredAtUtc], 'yyyy-MM') = Format((DATEADD(MM, -3, GETDATE())), 'yyyy-MM') ) THEN Format([OccuredAtUtc], 'yyyy-MM')
ELSE NULL
END AS Time
FROM @TABLE
)
Select Temp From cteQry
WHERE Time IS NOT NULL
GROUP BY Temp
ORDER BY [Time] ASC

最新更新