2

私はSQLクエリで立ち往生しています。私はSQL Serverを使用しています。

開始日と終了日を持つ Jobs を含むテーブルがあるとします。これらのジョブは、数日または数か月にわたる場合があります。それらの月にまたがるすべての仕事について、各月の合計勤務日数を取得する必要があります。

ジョブ

-----------------------------------
JobId | Start  | End    | DayRate |
-----------------------------------
1     | 1.1.13 | 2.2.13 | 2500    |
2     | 5.1.13 | 5.2.13 | 2000    |
3     | 3.3.13 | 2.4.13 | 3000    |

私が必要とする結果は次のとおりです。

Month | Days
--------------
Jan   | 57
Feb   | 7
Mar   | 28
Apr   | 2

そのようなクエリをどのように修正するか考えていますか?

また、日率に各ジョブの勤務日数を掛けて、各月の合計を計算したいと思います。これを結果に追加するにはどうすればよいですか?

ありがとう

4

3 に答える 3

2

再帰的 CTE を使用して、各 JobID の開始から終了までのすべての日を抽出し、月 (および私が推測する年) ごとにグループ化することができます。

;WITH CTE_TotalDays AS 
(
    SELECT [Start] AS DT, JobID FROM dbo.Jobs
    UNION ALL
    SELECT DATEADD(DD,1,c.DT), c.JobID FROM CTE_TotalDays c
    WHERE  c.DT < (SELECT [End] FROM Jobs j2 WHERE j2.JobId  = c.JobID)
)
SELECT 
     MONTH(DT) AS [Month] 
    ,YEAR(DT) AS [Year]
    ,COUNT(*) AS [Days] 
FROM CTE_TotalDays
GROUP BY MONTH(DT),YEAR(DT)
OPTION (MAXRECURSION 0)

SQLFiddle デモ

PS:あなたの例では1月に57日ではなく58日あります;)

于 2013-07-25T08:06:30.500 に答える
0

次のアプローチを使用してそれを行うことができます。

/* Your table with periods */
declare @table table(JobId int, Start date, [End] date, DayRate money)

INSERT INTO @table (JobId , Start, [End], DayRate)
VALUES
(1, '20130101','20130202', 2500),
(2,'20130105','20130205', 2000),
(3,'20130303','20130402' , 3000 )

/* create table where stored all possible dates
   if this code are supposed to be executed often you can create 
   table with dates ones to avoid overhead of filling it */
declare @dates table(d date)

declare @d date='20000101'
WHILE @d<'20500101'
    BEGIN 
        INSERT INTO @dates (d) VALUES (@d)
        SET @d=DATEADD(DAY,1,@d)
    END;

/* and at last get desired output */

SELECT YEAR(d.d) [YEAR], DATENAME(month,d.d) [MONTH], COUNT(*) [Days]
FROM @dates d
     CROSS JOIN @table t
WHERE d.d BETWEEN t.Start AND t.[End]
GROUP BY YEAR(d.d), DATENAME(month,d.d)
于 2013-07-25T08:09:30.277 に答える