2016-04-26 45 views
0

我现在的SQL是这样的:我需要指导格式化输出,一个SQL查询

Declare @Start datetime; 
Declare @End datetime; 

set @Start = '2016-04-4'; 
set @End = '2016-04-10'; 


Select pr.PR_FIELD03 AS EENo, pr.PR_Name AS EEName, lo.LocationName AS [State], SUM(ts.TotalMins/60) AS Hours, ts.OTFlag from TimeSheets as ts 
join BWSPRMSD as pr on ts.EmployeeSSN = pr.PR_SSN 
join Locations as lo on ts.LocationID = lo.LocationID 
where ts.TransDate >= @start AND ts.TransDate <= @End AND ts.ActiveFlag = 1 AND HolidayFlag = 0 AND VacationFlag = 0 
group by pr.PR_FIELD03, pr.PR_Name, lo.LocationName, ts.OTFlag; 

修订

这将会给我:

EENo EEName  State Hours OTFlag 
118  Randy  TX  31  1 
118  Randy  TX  40  0 
118  Randy  MS  40  0 
125  Bill  OK  40  0 

我需要的是:

EENo EEName  Reg Hours  O.T. Hours State 
118  Randy  40    31   TX 
118  Randy  40    0    MS 
125  Bill  40    0    OK 

任何建议,你可能会感激。

预先感谢您

UPDATE

我很抱歉,因为我原来的职位也不是很清楚。不,我不想仅更改列名称,如果OTFlag已设置,我需要在同一行上分割小时。

另外,如果linq或Lambda是你的一杯茶。这些答案同样适用。

+0

您希望列具有不同的名称或不同格式的数据吗? – WickedFan

+0

Randy,想象一下,除了你之外,没有人坐着......不知道你的查询中有什么数据出来,不知道你想要什么......请尝试以某种方式提出你的问题,让人们有机会理解您的需求......您的更新完全没有任何结果......请在您的专栏名称下方添加一些示例数据,以及这应该看起来像(*我拥有的*和*我想要的*) – Shnugo

+0

您的表结构是什么? ts.TotalMins/60似乎只是你的OT时间。你的常规分钟在哪里? – WickedFan

回答

1

继续进行CTE。我没有仔细检查我的代码,但它应该非常接近!假设在这里你的时间表上的一个名为OTFlag的标志在进入正常小时时设置为0,当它们是OT小时时设置为1。这样,每个员工在每个工作状态中都会有一个条目。

Declare @Start datetime; 
Declare @End datetime; 

set @Start = '2016-04-4'; 
set @End = '2016-04-10'; 

with regHours as (SELECT ts.employeeSSN, CAST(decimal(5,2),SUM(ts.totalMins/60) AS RegHours , lo.locationName as State 
FROM TimeSheets ts 
join Locations as lo on ts.LocationID = lo.LocationID 
where ts.TransDate >= @start 
AND ts.TransDate <= @End 
AND ts.ActiveFlag = 1 
AND ts.OTFlag = 0 
AND HolidayFlag = 0 
AND VacationFlag = 0 
Group BY ts.employeeSSN, lo.locationName) 



Select pr.PR_FIELD03 AS EENo 
     , pr.PR_Name AS EEName   
     , rh.regHours as 'Regular Hours' 
     , SUM(ts.TotalMins/60) AS 'O.T. Hours' 
     , lo.LocationName AS [State] 
from TimeSheets as ts 
join BWSPRMSD as pr on ts.EmployeeSSN = pr.PR_SSN 
join Locations as lo on ts.LocationID = lo.LocationID 
join regHours rh ON rh.employeeSSN = ts.employeeSSN AND rh.State = ts.LocationID 
where ts.TransDate >= @start 
AND ts.TransDate <= @End 
AND ts.ActiveFlag = 1 
AND HolidayFlag = 0 
AND VacationFlag = 0 
group by pr.PR_FIELD03, pr.PR_Name, lo.LocationName, rh.RegHours 
+1

这个CTE逻辑应该在同一行上获得你的OT时间和正常工作时间。另外,交叉适用于时间表可能已经工作。 – WickedFan

+0

现在不在工作...... @WickedFan看起来比我想象的要好100%。 – Randy

+0

注意到您的编辑。很高兴这是我所认为的大声笑!或者,如果位置不相关,则可以将这些状态连接在一起,从而更加突出这一点。 – WickedFan