试图为每个月/每年增加个人总数

时间:2017-04-19 16:35:44

标签: sql sql-server-2008 tsql ssms

"我们有两张桌子。一个小时已经发送给供应商(主)和一个小时我们即将发送(加载)。我试图根据每个人的小时和月份来计算基于月份和年份的小时数。我们希望找到那些特定月份超过300小时的人。

 CREATE TABLE MasterTabletesting(
     ID          CHAR(9) NOT NULL 
    ,Workdate    DATE  NOT NULL
    ,Emp         CHAR(30) NOT NULL
    ,HoursWorked DECIMAL(18,2) NOT NULL);
  INSERT INTO  MasterTabletesting(ID,Workdate,Emp,HoursWorked) VALUES ('25','20160731','7502',24);
  INSERT INTO  MasterTabletesting(ID,Workdate,Emp,HoursWorked) VALUES ('25','20160731','21874',128);
  INSERT INTO  MasterTabletesting(ID,Workdate,Emp,HoursWorked) VALUES ('25','20160731','7502',166);
  INSERT INTO  MasterTabletesting(ID,Workdate,Emp,HoursWorked) VALUES ('72','20160831','7508',180);
  INSERT INTO  MasterTabletesting(ID,Workdate,Emp,HoursWorked) VALUES ('72','20160831','5501',180);
  INSERT INTO  MasterTabletesting(ID,Workdate,Emp,HoursWorked) VALUES ('72','20160831','21037',23);
  INSERT INTO  MasterTabletesting(ID,Workdate,Emp,HoursWorked) VALUES ('66','20160831','83641',22);



  CREATE TABLE LoadTabletesting(
     ID          CHAR(9) NOT NULL 
    ,Workdate    CHAR(8)  NOT NULL
    ,Emp         CHAR(30) NOT NULL
    ,HoursWorked DECIMAL(18,2) NOT NULL);
  INSERT INTO  LoadTabletesting(ID,Workdate,Emp,HoursWorked) VALUES ('8','07312016','7500',24);
  INSERT INTO  LoadTabletesting(ID,Workdate,Emp,HoursWorked) VALUES ('6','07312016','21974',128);
  INSERT INTO  LoadTabletesting(ID,Workdate,Emp,HoursWorked) VALUES ('25','07312016','7500',166);
  INSERT INTO  LoadTabletesting(ID,Workdate,Emp,HoursWorked) VALUES ('72','08312016','7500',180);
  INSERT INTO  LoadTabletesting(ID,Workdate,Emp,HoursWorked) VALUES ('88','08312016','5507',180);
  INSERT INTO  LoadTabletesting(ID,Workdate,Emp,HoursWorked) VALUES ('23','08312016','21012',23);
  INSERT INTO  LoadTabletesting(ID,Workdate,Emp,HoursWorked) VALUES ('55','08312016','83667',22);}

load表中的日期是char变量类型,我已经使用强制转换解析了它。我的方法是将两个表中的必要数据放在一个标题为" Over300agtest:

的视图中。
SELECT ID AS 'ID'
,Employer AS 'Emp'
,month(WorkDate) AS 'Mnth'
,year(WorkDate) AS 'Yr'
,HoursworkedAS 'Hrs'
,’amt’ as ‘Table’
FROM Mastertabletesting 
WHERE HoursWorked IS NOT NULL
GROUP BY ID, Employer, month(WorkDate), year(WorkDate)

UNION all

SELECT ID AS 'ID'
,Employer AS 'Emp'
,month(CAST((RIGHT(workdate, 4) + LEFT(workdate, 4)) AS DATE)) AS 'Mnth'
,YEAR(CAST((RIGHT(workdate, 4) + LEFT(workdate, 4)) AS DATE)) AS 'Yr'
,hoursworked AS 'Hrs'
,‘alt’ as ‘Table’
FROM Loadtabletesting
WHERE HoursWorked IS NOT NULL
GROUP BY ID, Employer, month(CAST((RIGHT(workdate, 4) +LEFT workdate,4)) AS DATE)), year(CAST((RIGHT(workdate, 4) + LEFT(workdate, 4)) AS DATE))

然后我使用公用表表达式来查找在特定月份中超过300小时然后使用查询加入CTE以便添加他们为之工作的雇主的表达式。任何关于如何在每个月的小时栏下添加一行的建议都将非常感谢。

   with monthsum as(
    Select ID as 'ID'
    , mnth as 'mnth'
    , yr as 'yr'
    ,SUM(hrs)as 'TotalHrs'
    From over300agtest
    Group by ID, mnth, yr
    having SUM(hrs) > 300)

Select ms.ID
,ms.mnth
,ms.yr
,emp
,hrs
,o3.[table]
,totalhrs
From monthsum ms left outer join over300agtest o3
on ms.ID = o3.ID and ms.mnth = o3.mnth and ms.yr =o3.yr
Order by ms.ID,  ms.yr asc, ms.mnth asc

这是当前的输出:

+----+------+------+-------+-----+-------+----------+
| ID | mnth |  yr  |  emp  | hrs | table | totalhrs |
+----+------+------+-------+-----+-------+----------+
| 25 |    7 | 2016 |  7502 |  24 | AMT   |      484 |
| 25 |    7 | 2016 | 21874 | 128 | AMT   |      484 |
| 25 |    7 | 2016 |  7502 | 166 | AMT   |      484 |
| 25 |    7 | 2016 |  7500 | 166 | ALT   |      484 |
| 72 |    8 | 2016 |  7508 | 180 | AMT   |      563 |
| 72 |    8 | 2016 |  5501 | 180 | AMT   |      563 |
| 72 |    8 | 2016 | 21037 |  23 | AMT   |      563 |
| 72 |    8 | 2016 |  7500 | 180 | ALT   |      563 |
+----+------+------+-------+-----+-------+----------+

这是我想要的输出:

+-------+------+------+-------+-----+-------+
|  ID   | mnth |  yr  |  emp  | hrs | table |
+-------+------+------+-------+-----+-------+
| 25    |    7 | 2016 |  7502 |  24 | AMT   |
| 25    |    7 | 2016 | 21874 | 128 | AMT   |
| 25    |    7 | 2016 |  7502 | 166 | AMT   |
| 25    |    7 | 2016 |  7500 | 166 | ALT   |
| Total |      |      |       | 484 |       |
| 72    |    8 | 2016 |  7508 | 180 | AMT   |
| 72    |    8 | 2016 |  5501 | 180 | AMT   |
| 72    |    8 | 2016 | 21037 |  23 | AMT   |
| 72    |    8 | 2016 |  7500 | 180 | ALT   |
| Total |      |      |       | 563 |       |
+-------+------+------+-------+-----+-------+

1 个答案:

答案 0 :(得分:0)

我建议采用这种方法。你应该能够弄清楚具体细节。

select convert(char(6), cast(workdate as date), 120) yearMonth
, sum(hrs) totalHours
from etc
group by convert(char(6), cast(workdate as date), 120) 
having sum(hrs) > 300
相关问题