出于报告目的,我正在努力以可轻松在报告工具(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
任何帮助和想法都将不胜感激。
答案 0 :(得分:0)
这不是条件聚合。
这是从您的tblCalendar
中进行的简单选择,然后是基于CASE的SUBSELECT即可获得prio
的值。
伪代码:
SELECT
datefrom,
dateto,
CASE
WHEN {between [datefrom] en [dateto] 1 or more datetimestamp present in tblEvents}
THEN (SELECT {MAXIMUM of prio's between [datefrom] en [dateto]})
WHEN {before [date1] 1 or more datetimestamp present in tblEvents}
THEN (SELECT {LAST prio between [datefrom] en [dateto]})
WHEN {after [date2] 1 or more datetimestamp present}
THEN (SELECT {FIRST prio between [datefrom] en [dateto]})
ELSE -1
END as prio
FROM tblCalendar
CROSS APPLY等可能还有其他语法选项,但这是思考此问题的方法。