6

我正在使用 MS SQL Server,但欢迎来自其他数据库的比较解决方案。

这是我查询的基本形式。它从“incidentsm1”表中返回每天的呼叫次数:

SELECT 
  COUNT(*) AS "Calls",
  MAX(open_time),
  open_day
FROM 
  (
SELECT
 incident_id,
 opened_by,
 open_time - (9.0/24) AS open_time,
 DATEPART(dd, (open_time-(9.0/24))) AS open_day
   FROM incidentsm1 
   WHERE 
 DATEDIFF(DAY, open_time-(9.0/24), GETDATE())< 7

  ) inc1
GROUP BY open_day

此数据用于绘制条形图,但如果一周中的某一天没有调用,则没有结果行,因此没有条形图,用户会说,“为什么图表只有六天?从周六跳到周一?”

不知何故,我需要每天用一个空白行或类似的东西来 UNION ALL,但我想不通。

我受限于我可以使用一条 SQL 语句执行的操作,并且我具有只读访问权限,因此我无法创建临时表或任何东西。

4

4 回答 4

7

这样的事情怎么样?

SELECT 
  COUNT(incident_id) AS "Calls",
  MAX(open_time),
  days.open_day
FROM
(
  select datepart(dd,dateadd(day,-6,getdate())) as open_day union
  select datepart(dd,dateadd(day,-5,getdate())) as open_day union
  select datepart(dd,dateadd(day,-4,getdate())) as open_day union
  select datepart(dd,dateadd(day,-3,getdate())) as open_day union
  select datepart(dd,dateadd(day,-2,getdate())) as open_day union
  select datepart(dd,dateadd(day,-1,getdate())) as open_day union
  select datepart(dd,dateadd(day, 0,getdate())) as open_day 
) days
left join 
(
 SELECT
   incident_id,
   opened_by,
   open_time - (9.0/24) AS open_time,
   DATEPART(dd, (open_time-(9.0/24))) AS open_day
 FROM incidentsm1 
 WHERE DATEDIFF(DAY, open_time-(9.0/24), GETDATE()) < 7
) inc1 ON days.open_day = incidents.open_day
GROUP BY days.open_day

我只在简化的表模式上对其进行了测试,但我认为它应该可以工作。您可能需要修补 dateadd 的东西..

于 2009-02-27T03:28:27.500 回答
0

您可以创建一个包含您需要的日期的表变量,然后添加RIGHT JOIN到它上面吗?例如,

DECLARE @dateTable TABLE ([date] SMALLDATETIME)

INSERT INTO @dateTable
VALUES('26 FEB 2009')
INSERT INTO @dateTable
VALUES('27 FEB 2009')
-- etc

SELECT 
  COUNT(*) AS "Calls",
  MAX(open_time),
  open_day
FROM 
  (
SELECT
 incident_id,
 opened_by,
 open_time - (9.0/24) AS open_time,
 DATEPART(dd, (open_time-(9.0/24))) AS open_day
   FROM incidentsm1
   RIGHT JOIN @dateTable dates
   ON incidentsm1.open_day = dates.date
   WHERE 
 DATEDIFF(DAY, open_time-(9.0/24), GETDATE())< 7

  ) inc1
GROUP BY open_day

然而,更理想的情况是有一个带有日期的表格对象

于 2009-02-26T23:44:31.970 回答
0

我建议使用日期表。使用现有的日期表,您可以对日期表执行 RIGHT OUTER JOIN 以输入您丢失的日期。

于 2009-02-26T23:48:43.317 回答
0

您可以创建日期集作为查询的一部分吗?类似于以下内容:

SELECT COUNT(*) AS Calls, ...
    FROM incidentsm1 RIGHT OUTER JOIN
         (SELECT date_values
            FROM TABLE(('27 Feb 2009'), ('28 Feb 2009'), ('1 Mar 2009'),
                       ('2 Mar 2009'), ('3 Mar 2009'), ('4 Mar 2009'),
                       ('5 Mar 2009')) AS date_list
         )
         ON ...

这是受到 Informix 和 DB2 表示法的一种混合的启发,并且几乎可以保证两者在语法上都是不正确的。基本上,您的 DBMS 中有没有一种方法可以即时创建文字表。一种可能性 - 丑陋但几乎不可行 - 将执行从“双重”或某些表表达式中选择的日期文字的 7 路 UNION,以保证一行(在 Informix 术语中,SELECT MDY(2,28,2009) FROM "informix".systables WHERE tabid = 1 UNION ...)。

于 2009-02-27T01:36:09.830 回答