【发布时间】:2019-03-24 07:36:56
【问题描述】:
出于报告目的,我正在努力获取一些表格,这些表格可以在报告工具 (SSRS) 中轻松分组和汇总。
我使用 SQL Server 2014
我有以下表格: (示例中显示了日期,但这些实际上是日期时间)
tblEvents
datetimestamp prio
----------------------------------
2018-05-20 4
2018-08-05 1
2018-11-12 3
2018-11-13 1
这需要“重新采样”到 tblCalendar,它是一个等间隔的时间间隔表,具有可配置的 @start_datetime、@end_date、@number_of_intervals,我已经设法使用 CTE 制作:
tblCalendar
datefrom dateto
----------------------------------
1900-01-01 2018-04-12
2018-04-12 2018-05-31
2018-05-31 2018-07-19
2018-07-19 2018-09-06
2018-09-06 2018-10-25
2018-10-25 2018-12-13
2018-12-13 2100-01-01
想要的结果是:
datefrom dateto prio
-------------------------------------------
1900-01-01 2018-04-12 -1
2018-04-12 2018-05-31 4
2018-05-31 2018-07-19 4
2018-07-19 2018-09-06 1
2018-09-06 2018-10-25 1
2018-10-25 2018-12-13 3
2018-12-13 2100-01-01 3
对于每一个tblCalendar行,列prio需要根据:
IF between [datefrom] en [dateto] 1 or more datetimestamp present in tblEvents
take MAXIMUM of prio's between [datefrom] en [dateto]
ELSE
IF before [date1] 1 or more datetimestamp present in tblEvents
take LAST prio between [datefrom] en [dateto]
ELSE
IF after [date2] 1 or more datetimestamp present
take FIRST prio between [datefrom] en [dateto]
ELSE
prio unknown = -1
END
END
END
所以我将这个问题描述为条件聚合。
我对 SQL 很陌生,并尝试使用子查询、条件连接等来解决此问题,但无法使其正常工作。下面的代码是我目前的尝试。
SELECT
datefrom,
dateto,
MAX(Case
When ((datetimestamp >= datefrom) AND (datetimestamp <= dateto)) Then prio
When ((datetimestamp <= datefrom)) Then 'last-known-prio'
When ((datetimestamp > dateto)) Then 'first future-prio'
Else
-1 -- no prio known ever
End),
FROM tblCalendar CROSS JOIN tblEvents
任何帮助和想法将不胜感激。
【问题讨论】:
-
查看您的表格,我无法确定它们之间的共同点。有没有共同点?
-
您的尝试缺少 GROUP BY,因此语法无效。
-
为什么范围 1900-01-01 为 -1 .... 2018-04-12。不应该是4吗?为什么 3 为 2018-12-13 ... 2100-01-01。那不应该是1吗?