根据日期列表从数据中获取统计信息

问题描述 投票:0回答:2

我有很多门票。这些票证具有创建日期和完整日期。我想获得一个历史清单,列出在某一天开放的票数。即,对于日期的顺序列表中的任意日期,在该日之前(或之前)打开了多少票,并在其之后关闭(或具有空关闭日期)。

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'.我不确定从哪里开始,因为错误不是过于描述。

sql sql-server
2个回答
1
投票

看来,查询中@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

0
投票

如果有人谷歌搜索希望看到工作代码。谢谢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
© www.soinside.com 2019 - 2024. All rights reserved.