2015-11-13 78 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