2017-04-19 80 views
0

“我们有两个表,一个是发送给供应商(主)的小时,另一个是我们将要发送(加载)的小时数。总结基于月份和年份与分类汇总每个人的时间。我们希望找到那些谁拥有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);} 

负载表的日期是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

如果您可以为'Load'和'Master'表格以及样本数据提供表格模式,将会有所帮助。更重要的是,您似乎在两个表中都有“ID”,当您将记录推入单个视图时,这些ID可能会重叠。 – bc004346

+0

请阅读[this](http://spaghettidba.com/2015/04/24/how-to-post-a-t-sql-question-on-a-public-forum/)以获取关于改善问题的一些提示。 – HABO

+0

我不确定你可以用普通的SQL来做你想做的事情。您可以通过分区获得小时数,但我认为您必须以编程方式获取您要查找的显示输出。 – Shawn

回答

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 
+0

我正在使用SQL Server 2008.尝试使用上面的代码。收到消息:消息241,级别16,状态1,行1 转换日期和/或时间从字符串转换失败。 – Michael

相关问题