2014-07-09 20 views
0

我有一張桌子,每週有一個記錄,我的資源活動如下;生成有趣的數據視圖

Asset Name | Project | Week Beginning | Monday | Tuesday| Wednesday| Thursday| Friday| Saturday | Sunday 

James Project 1 26-06-2014 0 1 1 0 1 0 0 
James Project 1 03-07-2014 1 1 0 1 0 0 0 
Dave Project 3 03-07-2014 1 1 0 1 0 0 0 

我需要看詹姆斯和他什麼時候開始並完成他的項目。

所以我需要一個像下面

Asset Name | Project | Start Date on Project | End Date on Project| Number of days worked 
James  Project 1 27-06-2014 06-07-2014  6 
Dave  Project 3 03-07-2014 06-07-2-14  3 

所以我就在想一個case語句,光標或基於一套邏輯的存儲過程的視圖。我想制定出最好的和最快的方式來做到這一點。那麼有什麼想法如何快速生成這個視圖?今天早上因爲昨天晚上大腦凍結,所以如果任何人都能得到我的啓發,我會非常感激。

回答

1

嘗試這個

SELECT ASSETNAME,PROJECT,MIN(T.MIN)START_DAY,MAX(T.MAX) END_DAY, 
     DATEDIFF(DD,MIN(t.min) ,MAX(T.MAX)) DURATION 
FROM 
(
SELECT ASSETNAME,PROJECT,DATEADD(DD,MIN(WEEK),WEEKBEGINNING) 'MIN',DATEADD(DD,MAX(WEEK),WEEKBEGINNING) 'MAX' 
FROM #TEMP T 
CROSS APPLY(SELECT 0 'WEEK' WHERE T.MONDAY=1 UNION ALL SELECT 1 WHERE T.TUESDAY=1 UNION ALL 
      SELECT 2 WHERE T.WEDNESDAY=1 UNION ALL SELECT 3 WHERE T.THURSDAY=1 UNION ALL 
      SELECT 4 WHERE T.FRIDAY=1 UNION ALL SELECT 5 WHERE T.SATURDAY=1 UNION ALL 
      SELECT 6 WHERE T.SUNDAY=1 
      ) D 
GROUP BY ASSETNAME,PROJECT,WEEKBEGINNING 
)T 
2

首先,使用unpivot標準化數據,並將日期轉換爲實際日期。

select AssetName, Project, 
dateadd(d, CASE dayname      
        WHEN 'Monday' THEN 0 
        WHEN 'Tuesday' THEN 1 
        WHEN 'Wednesday' THEN 2 
        WHEN 'Thursday' THEN 3 
        WHEN 'Friday' THEN 4 
        WHEN 'Saturday' THEN 5 
        When 'sunday' then 6 
end,WeekBeginning) workdate 
from 
(     
    select * from yourdata 
    unpivot (dayvalue for dayname in (monday,tuesday,wednesday,thursday,friday,saturday,sunday)) u 
) v 

從那裏,它是一個簡單的情況下找到最早和最新的記錄。

+0

感謝,因爲這是一個巨大的幫助,作爲一個起點,對我來說。 使用此查詢的其他人的一些反饋。 表現 - 執行2分鐘 數據問題 - 生成2個星期一和2個星期的記錄,它會記錄8條記錄。 –

+0

@JamesKhan re:星期一的2條記錄 - 一個錯字 - 已編輯。您可以在unpivot之後使用簡單的where子句篩選出未工作的日子。 – podiluska

2
SELECT assetName, project, 
     MIN(DATEADD(d, first, weekBeginning)) AS startDate, 
     MAX(DATEADD(d, last, weekBeginning)) AS endDate, 
     SUM(days) AS daysWorked 
FROM mytable 
CROSS APPLY 
     (
     SELECT SUM(d), MIN(n), MAX(n) 
     FROM (
       SELECT monday, 0 
       UNION ALL 
       SELECT tuesday, 1 
       UNION ALL 
       SELECT wednesday, 2 
       UNION ALL 
       SELECT thursday, 3 
       UNION ALL 
       SELECT friday, 4 
       UNION ALL 
       SELECT saturday, 5 
       UNION ALL 
       SELECT sunday, 6 
       ) w (d, n) 
     ) q (days, first, last) 
GROUP BY 
     assetName, project 
+0

非常感謝。以大量幫助爲出發點。 使用此查詢的其他人的一些反饋。 31秒執行。 通過缺少q.days,q.first,q.last添加到組中,輕微調整語法。 對於人們在本週工作時間少於5天的情況,結束日期無法正確工作。解決方法是使用工作天來計算結束日期。我想只是贏家。將在40分鐘內告訴你。 –

+0

@JamesKhan:你不需要爲團隊添加日子等等。查看更新的查詢。 – Quassnoi

+0

謝謝你。結束日期不正確,似乎與開始日期相同。例如結束日期應該是18/12/2013,但是會在18/11/2013。 –