2015-11-13 148 views
1

我有一個計劃表,其中工作人員ID列週一至週日。如果包含值大於0,則表示工人計劃在當天工作。計算每週計劃的日期範圍內的預定日期的數量

如何高效計算工作人員在日期範圍內需要工作多少天?目前,我正在構建一個日期表並將它與Schedule表交叉連接,然後爲每個日期生成1或0。然後我總結一下價值來獲得總數。

http://sqlfiddle.com/#!3/a3292a/7

這似乎是工作,但它是由於交叉聯接相對緩慢。有沒有更好/更快的做法?

回答

1

你可以在WorkSchedule嘗試UNPIVOT,並加入到您的DATENAME查詢則DateValue ..然後你只值相加

;WITH 
L0 AS (SELECT 1 AS c UNION ALL SELECT 1), 
L1 AS (SELECT 1 AS c FROM L0 A CROSS JOIN L0 B), 
L2 AS (SELECT 1 AS c FROM L1 A CROSS JOIN L1 B), 
L3 AS (SELECT 1 AS c FROM L2 A CROSS JOIN L2 B), 
L4 AS (SELECT 1 AS c FROM L3 A CROSS JOIN L3 B), 
Nums AS (SELECT ROW_NUMBER() OVER (ORDER BY (SELECT 0)) AS i FROM L4), 
Schedule AS (
    SELECT * 
    FROM [WorkerSchedule] 
    UNPIVOT (
     Working 
     FOR [WorkDay] IN ([Sunday], [Monday], [Tuesday], [Wednesday], [Thursday], [Friday], [Saturday]) 
    ) u 
) 
SELECT s.WorkerId, SUM(s.Working) ScheduledDays 
FROM Schedule s 
INNER JOIN (SELECT DATENAME(weekday, DATEADD(DAY, i - 1, @StartDate)) AS DateValue 
      FROM Nums 
      WHERE i <= 1 + DATEDIFF(DAY, @StartDate, @EndDate)) d ON s.[WorkDay] = d.DateValue 
WHERE s.Working = 1 
GROUP BY s.WorkerId 
+0

謝謝,我不得不使用s.Working> 0,因爲該列可以包含任何數字(這基本上意味着工人在那一天有多少輪班) – ilitirit