我的任务是想出一种翻译以下数据的方法:
保存在 [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