我有很多门票。这些票证具有创建日期和完整日期。我想获得一个历史清单,列出在某一天开放的票数。即,对于日期的顺序列表中的任意日期,在该日之前(或之前)打开了多少票,并在其之后关闭(或具有空关闭日期)。
dbo.wh_task中的相关列如下所示:
task_number create_time date_completed
T20180619.0041 2018-06-19 19:37:24.727 2018-06-26 23:36:21.613
T20180619.0048 2018-06-19 20:41:07.800 2018-06-27 19:26:43.480
... ... ...
我到目前为止:
DECLARE @Dates table (
day DATE,
PRIMARY KEY (day)
)
DECLARE @dIncr DATE = '2016-01-01'
DECLARE @dEnd DATE = CAST(GetDate() as DATE)
WHILE ( @dIncr < @dEnd )
BEGIN
INSERT INTO @Dates (day) VALUES( @dIncr )
SELECT @dIncr = DATEADD(DAY, 1, @dIncr )
-- --------------------------------
SELECT
@Dates.day,
COUNT(tickets.task_number) AS CountOfOpenTickets
FROM @Dates
LEFT JOIN dbo.wh_task tickets ON Dates.day BETWEEN tickets.create_time AND tickets.date_completed
当我运行代码时,我得到SQL Error (102): Incorrect syntax near 'date_completed'.
我不确定从哪里开始,因为错误不是过于描述。
看来,查询中@dates表的别名使用不当,而且聚合函数group by
缺少Count
子句。您可以尝试此查询。还要确保你有END
循环的WHILE
。
SELECT
d.day,
COUNT(tickets.task_number) AS CountOfOpenTickets
FROM @Dates as d
LEFT JOIN dbo.wh_task tickets ON d.day BETWEEN tickets.create_time AND tickets.date_completed
group by d.day
如果有人谷歌搜索希望看到工作代码。谢谢Vinit!
DECLARE @Dates table (
day DATE,
PRIMARY KEY (day)
)
DECLARE @dIncr DATE = '2016-01-01'
DECLARE @dEnd DATE = CAST(GetDate() as DATE)
WHILE ( @dIncr <= @dEnd)
BEGIN
INSERT INTO @Dates (day) VALUES( @dIncr )
SELECT @dIncr = DATEADD(DAY, 1, @dIncr )
END
-- --------------------------------
SELECT
dates.day,
COUNT(tickets.task_number) AS CountOfOpenTickets
FROM @Dates as dates
LEFT JOIN dbo.wh_task tickets ON (dates.day >= tickets.create_time) AND ((dates.day < tickets.date_completed) OR (tickets.date_completed IS NULL))
GROUP BY dates.day
ORDER BY dates.day DESC