簡體   English   中英

跨年的每周SQL SUM小時

[英]SQL SUM hours by week across number of years

我在SQL數據庫中有一個表,其中包含有關員工多年工作時間的信息。 每個雇員在特定日期可以有多個記錄,並且每個雇員的開始日期可以不同。

我試圖根據每個員工的第一周來總結他們的每周工作時間。 因此,如果該員工於2018年4月17日開始工作,則本周登錄的任何時間都將被視為該員工的第1周,而下一周則是第二周,以此類推。對於另一位員工,一周可以在不同的日期/月份/年等

我的數據包括以下字段:

Sequence_ID:與單個員工有關

Date_European:與員工記錄的每個小時相關的日期,其中最少的時間是該員工在公司開始的首次日期

小時:記錄的小時數

我在數據中還有一個Year字段,它是Date_European列的年份。

以下是我嘗試過的內容,但我知道它甚至與我需要的格式不符。

select 
    Sequence_ID
    ,DATEPART(week,Date_European) AS Week
    ,DATEPART(year,Date_European) AS Year
    ,SUM([Hours]) AS Weekly_Hours
from [AB_DCU_IP_2018].[dbo].[mytable]
group by 
    Sequence_ID
    ,DATEPART(week,Date_European)
    ,DATEPART(year,Date_European)
order by 
    Sequence_ID
    ,DATEPART(week,Date_European)
    ,DATEPART(year,Date_European)

我嘗試創建“周”字段。 從上面的代碼中,它僅能告訴我日期與特定年份的哪個星期相關。 然后,我添加了“年份”列以區分不同的年份,但這再次僅給出了特定的年份。

有什么方法可以按照我想要的格式創建“周”字段? (最早的日期和周圍的日期是第1周)。

我試圖按功能使用等級和分區,無法使其正常工作。

任何幫助將不勝感激,因為我一直在尋找解決方案數小時。

提前致謝。

編輯:如何創建初始表

CREATE TABLE mytable(Sequence_ID   VARCHAR(6) NOT NULL ,Date_European DATE NOT NULL ,Hours NUMERIC(5,1) NOT NULL);

INSERT INTO mytable(Sequence_ID,Date_European,Hours) VALUES ('da6Wrw','09/05/2016',7.3);
INSERT INTO mytable(Sequence_ID,Date_European,Hours) VALUES ('da6Wrw','09/06/2016',7.3);
INSERT INTO mytable(Sequence_ID,Date_European,Hours) VALUES ('da6Wrw','09/07/2016',7.3);
INSERT INTO mytable(Sequence_ID,Date_European,Hours) VALUES ('da6Wrw','09/08/2016',7.3);
INSERT INTO mytable(Sequence_ID,Date_European,Hours) VALUES ('da6Wrw','09/09/2016',7.3);
INSERT INTO mytable(Sequence_ID,Date_European,Hours) VALUES ('da6Wrw','09/12/2016',7.3);
INSERT INTO mytable(Sequence_ID,Date_European,Hours) VALUES ('da6Wrw','09/13/2016',7.3);
INSERT INTO mytable(Sequence_ID,Date_European,Hours) VALUES ('da6Wrw','09/14/2016',7.3);
INSERT INTO mytable(Sequence_ID,Date_European,Hours) VALUES ('da6Wrw','09/15/2016',7.3);
INSERT INTO mytable(Sequence_ID,Date_European,Hours) VALUES ('da6Wrw','09/16/2016',7.3);
INSERT INTO mytable(Sequence_ID,Date_European,Hours) VALUES ('da6Wrw','09/19/2016',7.3);
INSERT INTO mytable(Sequence_ID,Date_European,Hours) VALUES ('da6Wrw','09/20/2016',7.3);
INSERT INTO mytable(Sequence_ID,Date_European,Hours) VALUES ('da6Wrw','09/21/2016',7.3);
INSERT INTO mytable(Sequence_ID,Date_European,Hours) VALUES ('da6Wrw','09/22/2016',7.3);
INSERT INTO mytable(Sequence_ID,Date_European,Hours) VALUES ('da6Wrw','09/23/2016',7.3);
INSERT INTO mytable(Sequence_ID,Date_European,Hours) VALUES ('da6Wrw','09/26/2016',7.3);
INSERT INTO mytable(Sequence_ID,Date_European,Hours) VALUES ('da6Wrw','09/27/2016',7.3);
INSERT INTO mytable(Sequence_ID,Date_European,Hours) VALUES ('da6Wrw','09/28/2016',7.3);
INSERT INTO mytable(Sequence_ID,Date_European,Hours) VALUES ('da6Wrw','09/29/2016',7.3);
INSERT INTO mytable(Sequence_ID,Date_European,Hours) VALUES ('da6Wrw','09/30/2016',7.3);

我想要的結果是什么:

| Sequence_ID | Date_European | DATEPART(week,Date_European) | Hours | Desired_OutCome_Week |
| da6Wrw      | 05/09/2016    |                           37 |   7.3 |                    1 |
| da6Wrw      | 06/09/2016    |                           37 |   7.3 |                    1 |
| da6Wrw      | 07/09/2016    |                           37 |   7.3 |                    1 |
| da6Wrw      | 08/09/2016    |                           37 |   7.3 |                    1 |
| da6Wrw      | 09/09/2016    |                           37 |   7.3 |                    1 |
| da6Wrw      | 12/09/2016    |                           38 |   7.3 |                    2 |
| da6Wrw      | 13/09/2016    |                           38 |   7.3 |                    2 |
| da6Wrw      | 14/09/2016    |                           38 |   7.3 |                    2 |
| da6Wrw      | 15/09/2016    |                           38 |   7.3 |                    2 |
| da6Wrw      | 16/09/2016    |                           38 |   7.3 |                    2 |
| da6Wrw      | 19/09/2016    |                           39 |   7.3 |                    3 |
| da6Wrw      | 20/09/2016    |                           39 |   7.3 |                    3 |
| da6Wrw      | 21/09/2016    |                           39 |   7.3 |                    3 |
| da6Wrw      | 22/09/2016    |                           39 |   7.3 |                    3 |
| da6Wrw      | 23/09/2016    |                           39 |   7.3 |                    3 |
| da6Wrw      | 26/09/2016    |                           40 |   7.3 |                    4 |
| da6Wrw      | 27/09/2016    |                           40 |   7.3 |                    4 |
| da6Wrw      | 28/09/2016    |                           40 |   7.3 |                    4 |
| da6Wrw      | 29/09/2016    |                           40 |   7.3 |                    4 |
| da6Wrw      | 30/09/2016    |                           40 |   7.3 |                    4 |
Set DateFirst 1

select 
    Sequence_ID,
    (datediff(day , DQ.WeekStarted, Date_European) / 7 + 1) EmployeeWeekNumber
    ,SUM([Hours]) AS Weekly_Hours
--into [AB_DCU_IP_2018].[dbo].[Weekly_Work_Hours_Employee]
from [AB_DCU_IP_2018].[dbo].[All_IPower_HR_Assurance_4]
CROSS APPLY (SELECT DATEADD(day, -1 * (datepart(weekday,start_date) % 7), start_date)  AS WeekStarted   
                                    FROM YourTable 
                                    WHERE <condition  to get the start_date you need>
            ) DQ
group by 
    Sequence_ID,
   (datediff(day , DQ.WeekStarted, Date_European) / 7 + 1)
order by 
    Sequence_ID
    ,DATEPART(week,Date_European)
    ,DATEPART(year,Date_European)

這是使用您發布的樣本數據的另一種方法。

select mt.Sequence_ID
    , mt.Date_European 
    , DATEPART(week, mt.Date_European) 
    , mt.Hours
    , MyRow.GroupNum
from  mytable mt
join
(
    select WeekNum = DATEPART(week,Date_European) 
        , GroupNum = ROW_NUMBER() over(order by DATEPART(week,Date_European))
    from  mytable
    group by DATEPART(week,Date_European) 

) MyRow on MyRow.WeekNum = DATEPART(week, mt.Date_European) 

嘗試這個

select *,rn-1 [Employee_week] from (
select *,dense_RANK() over(Partition by Sequence_ID order by iif(weekly_hours=0,0,week) ) [rn] from (
select 
    Sequence_ID
    ,DATEPART(week,Date_European) AS Week
    ,DATEPART(year,Date_European) AS Year
    ,SUM([Hours]) AS Weekly_Hours
--into [AB_DCU_IP_2018].[dbo].[Weekly_Work_Hours_Employee]
from [AB_DCU_IP_2018].[dbo].[All_IPower_HR_Assurance_4]
group by 
    Sequence_ID
    ,DATEPART(week,Date_European)
    ,DATEPART(year,Date_European)
order by 
    Sequence_ID
    ,DATEPART(week,Date_European)
    ,DATEPART(year,Date_European))a)a
    where rn = 2

這將為您提供每個員工在第一周工作的時間,使用rn> 2來獲取剩余的幾周

實際上,我發現了一種更簡單的方法來計算使用DENSE_Rank函數的員工的工作周數。

如果有人出現類似問題,我將在下面列出。 我已將DATEPART部分注釋掉,因為我只是使用這些列作為檢查以確保其正常工作:

select 
     Sequence_ID
    ,Date_European
    --,DATEPART(week,Date_European) AS Week
    --,DATEPART(year,Date_European) AS Year
    ,DENSE_RANK() OVER (PARTITION BY Sequence_ID ORDER BY DATEPART(year,Date_European), DATEPART(week,Date_European) asc) AS EmployeeWeekNumber
    ,Hours
from [AB_DCU_IP_2018].[dbo].[All_IPower_HR_Assurance_4]
order by 
     Sequence_ID 
    ,Date_European
    --,DATEPART(week,Date_European)
    --,DATEPART(year,Date_European) 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM