2

这是我的场景。我有一张这样的桌子:

-------------------------------------------------- ----------------
| 票 | 开始日期 | 完成日期 |
-------------------------------------------------- ----------------
| 123 | 12 年 4 月 1 日 | 2012 年 4 月 20 日 |
| 124 | 12 年 4 月 4 日 | 2012 年 4 月 28 日 |
| 125 | 2012 年 4 月 16 日 | 空 |
| 126 | 2012 年 4 月 28 日 | 12 年 5 月 4 日 |
| 127 | 12 年 5 月 2 日 | 空 |
-------------------------------------------------- ----------------

我需要得到这样的结果集:

-------------------------------------------------- ----------------
| 周 | 打开| 关闭| 活跃 |
-------------------------------------------------- ----------------
| 5 | 3 | 2 | 50 |
| 6 | 4 | 5 | 49 |
| 7 | 2 | 6 | 45 |
| 8 | 5 | 4 | 46 |
-------------------------------------------------- ----------------

基本上,我想查看在给定的一周内打开了多少张票,关闭了多少张,以及在那一周内有多少张只是处于活动状态(之前打开过,但尚未关闭)。

我想我可能已经想出了如何推导出打开和关闭,但我真的很难从中查询活动列。有任何想法吗?

更新:根据要求添加信息。

这是针对 SQL 的。

到目前为止我的查询是这样的,它还不包括活动:

    选择
    一周,
    a.创建,
    b.关闭
    从
    (
    选择
        DATEPART(WEEK, t.[start date]) AS week,
        COUNT(t.[ticket]) AS 打开
        FROM sqltable AS t
        WHERE [开始日期] > GETDATE() - 69 -- 过去 10 周
        通过...分组
        DATEPART(WEEK, t.[开始日期])
    ) 作为一个
    左连接
    (
        选择
        DATEPART(WEEK, t.[完成日期]) 作为周,
        COUNT(t.[ticket]) 已关闭
        FROM sqltable AS t
        WHERE [完成日期] > GETDATE() - 69 -- 过去 10 周
        通过...分组
        日期部分(周,t.[完成日期])
    ) 作为乙
    ON a.week = b.week
    一周订购;
4

2 回答 2

1

在任何数据库中,您都可以使用相关子查询来执行此操作。但是,数据库中的日期函数并不相同,所以让我假设您知道如何执行此操作。

select weeknum, sum(startweek) as starts, sum(endweek) as ends,
       (select count(*) as numstarts
        from t ts
        where DATEPART(WEEK, ts.[start date]) <= weeknum and
              datepart(week, ts.[end date]) >= weeknum
       ) as actives
from ((select DATEPART(WEEK, t.[start date]) AS weeknum, 1 as startweek, 0 endweek,
              t.[start date] as startdate, NULL as enddate
       from t
      ) union all
      (select DATEPART(WEEK, t.[end date]) AS weeknum, 0 as startweek, 1 as endweek,
              NULL, t.[end date] as enddate
       from t
      )
     ) t
group by weeknum
order by 1

如果您使用的是 SQL Server 2012(或 Oracle),那么您也可以使用累积总和来执行此操作。

于 2012-10-02T13:29:07.917 回答
0

有一种简单的方法可以使用 IF 语句并为累积总和的每个真实结果生成 +1:

SELECT
  DATE_FORMAT(startdate, "%U") as week,
  SUM(IF(startdate<>'', 1, 0)) as opened,
  SUM(IF(enddate<>'', 1, 0)) as closed,
  SUM(IF(startdate<>'' AND enddate<>'',  0, 1)) as active
FROM ticket
GROUP BY week;

查询很简单,希望对您有所帮助

在 MySQL 5.6 中试过这个SQLFiddle

于 2018-02-11T08:13:58.900 回答