2

調子:

Start date: 31-12-2012  
End date:   01-04-2013
  • モジュールはproject_id
  • module_start_date読み込みは、との間の読み込みを表し、module_end_date40 user_id=6%無料です。
SELECT [user_id], module_id, module_start_date, module_end_date,
            1 - loading_percentage loading
FROM module_user_master_map
WHERE module_start_date >= '2012-12-31'
      AND module_end_date <= '2013-04-01'
      AND [user_id]=6

このクエリを使用すると、次の出力が得られます。

user_id | module_id | module_start_date | module_end_date | loading
-------------------------------------------------------------------    
6       | 3         | 01-01-2013        | 31-01-2013      | 0.4
6       | 4         | 15-02-2013        | 28-02-2013      | 0.2
6       | 5         | 01-03-2013        | 15-03-2013      | 0.7
6       | 3         | 30-01-2013        | 30-01-2013      | 0.5

出力を注意深く見ると、ユーザーは日付で100%利用可能である、つまりユーザー01-02-201314-02-2013読み込みは1であることがわかります。

//上記の文の日付を修正しました。

次のような出力が欲しい

user_id | module_id | module_start_date | module_end_date | loading
-------------------------------------------------------------------
6       | 3         | 30-01-2013        | 30-01-2013      | 0.5
6       | 3         | 01-01-2013        | 31-01-2013      | 0.4
6       | Null      | 01-02-2013        | 14-02-2013      | 1
6       | 4         | 15-02-2013        | 28-02-2013      | 0.2
6       | 5         | 01-03-2013        | 15-03-2013      | 0.7
6       | Null      | 16-03-2013        | 01-04-2013      | 1

開始日と終了日からの日付を取得する機能があります。

4

1 に答える 1

0

このアプローチに従うことができます:

最小/最大範囲内の日付テーブル関数からの日数で、残りの日数を結合します。(すでに日付テーブル関数があるので、そのコードは省略します)

第 1 週と第 3 週の結果があるとします。1 月のすべての日にこれらを結合したままにすると、ギャップがどこにあるかを簡単に確認できます。

DECLARE @from DATETIME2(1) = '2013-01-01'
DECLARE @to DATETIME2(1) = '2013-01-31'

DECLARE @from_wk1 DATETIME2(1) = '2013-01-01'
DECLARE @to_wk1 DATETIME2(1) = '2013-01-07'

DECLARE @from_wk3 DATETIME2(1) = '2013-01-15'
DECLARE @to_wk3 DATETIME2(1) = '2013-01-22';

WITH    OccupiedDays ( [dt] )
          AS ( SELECT   B.[dt]
               FROM     DateTable(@from_wk1, @to_wk1) B
               UNION ALL
               SELECT   C.[dt]
               FROM     DateTable(@from_wk3, @to_wk3) C
             )
    SELECT  A.[dt]  AS AllDays,
            OD.[dt] AS OccupiedDays
    FROM    DateTable(@from, @to) A
            LEFT JOIN OccupiedDays OD ON A.[dt] = OD.[dt]

結果:

SQL出力

ここで必要なのは、null 値を入力し、グループ化や集計を行うことだけです。

于 2013-01-30T16:12:17.650 に答える