1

先週の水曜日にTSQLから始めました...

tblStage1 に次のデータがあります。

PROJECT    USERNAME           DATE          PERCENTAGE                  
---------  -----------------  ------------  ---------------------- 
Project 1  DOMAIN\Chris.User  03/01/2013    0.25                     
Project 1  DOMAIN\Chris.User  05/01/2013    0.75                     
Project 1  DOMAIN\Chris.User  07/01/2013    1                     
Project 1  DOMAIN\John.User   02/01/2013    1                     
Project 1  DOMAIN\John.User   06/01/2013    0.5                     

tblRawData に次のデータがあります

PROJECT    START_DATE   END_DATE
---------- -----------  ----------
Project 1  01/01/2013   09/01/2013

次のデータを tblStage2 に取得したいと思います (データ ポイントは START_DATE と END_DATE によってバインドされます)。

PROJECT    USERNAME           DATE          PERCENTAGE                  
---------  -----------------  ------------  ---------------------- 
Project 1  DOMAIN\Chris.User  01/01/2013    0                     
Project 1  DOMAIN\Chris.User  02/01/2013    0                         
Project 1  DOMAIN\Chris.User  03/01/2013    0.25                     
Project 1  DOMAIN\Chris.User  04/01/2013    0.25                      
Project 1  DOMAIN\Chris.User  05/01/2013    0.75                     
Project 1  DOMAIN\Chris.User  06/01/2013    0.75                     
Project 1  DOMAIN\Chris.User  07/01/2013    1                     
Project 1  DOMAIN\Chris.User  08/01/2013    1                     
Project 1  DOMAIN\Chris.User  09/01/2013    1                  
Project 1  DOMAIN\John.User   01/01/2013    0                     
Project 1  DOMAIN\John.User   02/01/2013    1                         
Project 1  DOMAIN\John.User   03/01/2013    1
Project 1  DOMAIN\John.User   04/01/2013    1                      
Project 1  DOMAIN\John.User   05/01/2013    1                     
Project 1  DOMAIN\John.User   06/01/2013    0.5                     
Project 1  DOMAIN\John.User   07/01/2013    0.5                     
Project 1  DOMAIN\John.User   08/01/2013    0.5                     
Project 1  DOMAIN\John.User   09/01/2013    0.5                  

このようなこの主題に関連するトピックが多数あることを認識しています。私の場合、特に制限はなく、比較的わかりやすいクリーンなルーチンを探しています。

関数があることは知っていますが、ステートメント例でコマンドをDateAdd見たことがありません。INSERT INTOデータセットを反復処理して補間値を作成する方法について混乱しています。私はまだ未熟すぎて、他の例の完全なコンテキストを理解できません。助けや説明をいただければ幸いです。

編集最終的な目標をより適切に示すために、サンプル データに追加情報を追加しました。このデータセットには複数のユーザーがいます。USERNAME 列は、元のソース (InfoPath フォームのユーザー ピッカー) によってデータ セットに配置されます。最初の値が割り当てられるまで、すべての「パーセンテージ」は「0」であり、変更されるか、プロジェクトが終了日に達するまで、その値が保持されます。これが明確になることを願っています!

4

3 に答える 3

2

USERNAME がどのように入力されたかは明らかではありません。ここのプロジェクトで同じユーザー名を持っていると思います。以下の CTE は DATE テーブルを作成するだけです。独自の日付テーブルがある場合は、この部分をスキップできます。

SQL フィドル

DECLARE @ENDDate DATETIME

SELECT @ENDDate =  MAX(END_DATE) FROM tblRawData

;WITH tblDate AS 
( SELECT CAST(MIN(START_DATE) AS DATE) AS [date]
  FROM tblRawData 
  UNION ALL
  SELECT DATEADD(month,1,[DATE])
  FROM tblDate
  WHERE [DATE] < @ENDDate
 )
SELECT
  d.[date]
  ,r.[Project]
  ,UserName =   (SELECT MAX(USERNAME) FROM tblStage1 ts WHERE r.PROJECT = ts.PROJECT)
  ,Percentage = (SELECT ISNULL(MAX(Percentage),0) FROM tblStage1 ts WHERE r.PROJECT = ts.PROJECT AND ts.[date] <= d.[date])
FROM tblDate d
INNER JOIN tblRawData r
  ON d.[date] between r.[START_DATE] AND r.[END_DATE]
ORDER BY 2,1
OPTION (Maxrecursion 0) 

編集: 日付が月ごとに増えていることがわかりました。CTE クエリを更新します。ただし、すべてのプロジェクトの開始日と終了日が月の初日にあることを確認する必要があります。


EDIT 新しいサンプルの日付に基づいてください。クエリは少し醜くなりましたが、機能します。私は今、より良い解決策を考えることはできません。

新しいSQL フィドラー

DECLARE @ENDDate DATETIME

SELECT @ENDDate =  MAX(END_DATE) FROM tblRawData

;WITH tblDate AS 
( SELECT CAST(MIN(START_DATE) AS DATE) AS [date]
  FROM tblRawData 
  UNION ALL
  SELECT DATEADD(month,1,[DATE])
  FROM tblDate
  WHERE [DATE] < @ENDDate
 )
,ProjectList AS (
 SELECT Project,UserName
 FROM tblStage1
 GROUP BY Project,UserName
)
,cte AS (
SELECT
  d.[date]
  ,r.[Project]
  ,UserName = pl.Username
  ,CloseDate = (SELECT MAX(ts.[date]) FROM tblStage1 ts WHERE r.PROJECT = ts.PROJECT AND ts.UserName = pl.UserName AND ts.[date] <= d.[date])
FROM tblDate d
INNER JOIN tblRawData r
  ON d.[date] between r.[START_DATE] AND r.[END_DATE]
CROSS APPLY ProjectList pl
)
SELECT cte.[date],cte.project,cte.UserName,ISNULL(t.[PERCENTAGE],0) AS PERCENTAGE
FROM cte
LEFT JOIN tblStage1 t
 ON cte.PROJECT = t.PROJECT 
  AND cte.UserName = t.UserName  
  AND cte.CloseDate = t.[Date]
ORDER BY 2,3,1
于 2013-05-07T18:09:54.940 に答える
0

本当に簡単な方法は、必要な各月の月の値で一時テーブルを作成し、そのテーブルで左結合を行うことです。

好奇心から - なぜ 8 月 1 日が 0 ではなく?

于 2013-05-07T18:09:20.553 に答える