2

これが私のシナリオです。私はこのようなテーブルを持っています:

-------------------------------------------------- --------------------------------
| チケット| 開始日| 終了日|
-------------------------------------------------- --------------------------------
| 123 | 4月1日| 4月20日|
| 124 | 4月12日| 4月28日|
| 125 | 4月16日| NULL |
| 126 | 4月28日| 5月4日|
| 127 | 5月2日| NULL |
-------------------------------------------------- --------------------------------

そして、私はこのような結果セットを取得する必要があります:

-------------------------------------------------- --------------------------------
| 週| オープン| クローズ| アクティブ|
-------------------------------------------------- --------------------------------
| 5 | 3 | 2 | 50 |
| 6 | 4 | 5 | 49 |
| 7 | 2 | 6 | 45 |
| 8 | 5 | 4 | 46 |
-------------------------------------------------- --------------------------------

基本的に、特定の週に開かれたチケットの数、閉じられた数、およびその週に単純にアクティブだった(以前に開かれ、まだ閉じられていない)数を確認したいと思います。

開いた列と閉じた列を導出する方法を理解したかもしれませんが、これからアクティブな列をクエリするのに本当に苦労しています。何か案は?

更新:要求に応じて情報を追加します。

これはSQL用です。

私がこれまでに持っているクエリは次のようなものですが、まだアクティブなものは含まれていません。

    選択する
    a.week、
    a.created、
    b。クローズ
    から
    ((
    選択する
        DATEPART(WEEK、t。[開始日])AS週、
        COUNT(t。[ticket])ASオープン
        FROM sqltable AS t
        WHERE[開始日]>GETDATE()-69-過去10週間
        GROUP BY
        DATEPART(WEEK、t。[開始日])
    ) として
    左参加
    ((
        選択する
        DATEPART(WEEK、t。[終了日])AS週、
        COUNT(t。[ticket])ASクローズ
        FROM sqltable AS t
        WHERE[終了日]>GETDATE()-69-過去10週間
        GROUP BY
        DATEPART(WEEK、t。[終了日])
    )AS b
    オンa.week=b.week
    a.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 に答える