2013-08-19 56 views
0

我使用SSRS 2005来创建报告,以显示不同类别小时的款项(注册时间,加班等)多行总计2005

SELECT OGL.PACostCenter, vpt.LL6, sum((vpt.timeinseconds*1.0)/3600) [Hours] 
FROM totals as vpt 
INNER JOIN OracleLookup OGL on vpt.LL6 = OGL.OracleCostCenter COLLATE SQL_Latin1_General_CP1_CI_AI 
WHERE vpt.DATE BETWEEN @StartDate AND @EndDate 
AND vpt.PAYCODENAME in ('519-H-Overtime 1.0', 
      '519-H-Holiday OT 1.5', 
      '519-H-Overtime 1.5', 
      '519-H-Overtime 2.0', 
      '519-H-Regular') 
GROUP BY OGL.PayrollAccount, vpt.LL6 
ORDER BY OGL.PayrollAccount, vpt.LL6 

我总学时罚款,但也希望能够把它打破,只有加班时间的专栏,只有正常的时间和一切的总数。有没有一种简单/干净的方式来做到这一点,任何人都知道?我尝试过使用不同的数据集,但它并没有达到我的预期,而像子查询之类的东西似乎会变得杂乱和冗余。

回答

2

是的,你可以使用条件求和:

SELECT OGL.PACostCenter, vpt.LL6, sum((vpt.timeinseconds*1.0)/3600) [Hours], 
     sum(case when vpt.PAYCODENAME in ('519-H-Overtime 1.0', '519-H-Holiday OT 1.5', 
             '519-H-Overtime 1.5', '519-H-Overtime 2.0' 
             ) 
       then (vpt.timeinseconds*1.0)/3600 
       else 0 
      end) as OvertimeHours, 
     sum(case when vpt.PAYCODENAME in ('519-H-Regular') 
       then (vpt.timeinseconds*1.0)/3600 
       else 0 
      end) as RegularHours, 
FROM totals as vpt 
INNER JOIN OracleLookup OGL on vpt.LL6 = OGL.OracleCostCenter COLLATE SQL_Latin1_General_CP1_CI_AI 
WHERE vpt.DATE BETWEEN @StartDate AND @EndDate 
AND vpt.PAYCODENAME in ('519-H-Overtime 1.0', 
      '519-H-Holiday OT 1.5', 
      '519-H-Overtime 1.5', 
      '519-H-Overtime 2.0', 
      '519-H-Regular') 
GROUP BY OGL.PayrollAccount, vpt.LL6 
ORDER BY OGL.PayrollAccount, vpt.LL6; 
+0

非常感谢,工作得很好。 – mrshickadance

0

,因为使用的是SSRS我会建议你做这样的

SELECT OGL.PACostCenter, vpt.PAYCODENAME, vpt.LL6, sum((vpt.timeinseconds*1.0)/3600) [Hours] 
FROM totals as vpt 
INNER JOIN OracleLookup OGL on vpt.LL6 = OGL.OracleCostCenter COLLATE SQL_Latin1_General_CP1_CI_AI 
WHERE vpt.DATE BETWEEN @StartDate AND @EndDate 
AND vpt.PAYCODENAME in ('519-H-Overtime 1.0', 
     '519-H-Holiday OT 1.5', 
     '519-H-Overtime 1.5', 
     '519-H-Overtime 2.0', 
     '519-H-Regular') 
GROUP BY OGL.PayrollAccount, vpt.PAYCODENAME, vpt.LL6 
ORDER BY OGL.PayrollAccount, vpt.LL6 

,让你的总数为每种类型(普通,加班等),然后在您的报告中创建总和

+0

我认为如果我不把一些加班加在一起,这会非常有效。尽管这很好,但它使我能够与分组比赛。谢谢 – mrshickadance

+0

你非常欢迎,祝你好运 – Hedinn

1

假设您可以控制该数据集查询,那么您应该可以执行如下操作:

SELECT OGL.PACostCenter, vpt.LL6 
    , sum((vpt.timeinseconds*1.0)/3600) [Hours] -- your initial total 
    , sum(case when vpt.PAYCODENAME = '519-H-Overtime 1.0' 
    then vpt.timeinseconds*1.0 else null end)/3600 [OT1] 
    , sum(case when vpt.PAYCODENAME = '519-H-Overtime 1.5' 
    then vpt.timeinseconds*1.0 else null end)/3600 [OT1pt5] 
    -- further SUM/CASE as required 
FROM totals as vpt 
INNER JOIN OracleLookup OGL on vpt.LL6 = OGL.OracleCostCenter COLLATE SQL_Latin1_General_CP1_CI_AI 
WHERE vpt.DATE BETWEEN @StartDate AND @EndDate 
AND vpt.PAYCODENAME in ('519-H-Overtime 1.0', 
      '519-H-Holiday OT 1.5', 
      '519-H-Overtime 1.5', 
      '519-H-Overtime 2.0', 
      '519-H-Regular') 
GROUP BY OGL.PayrollAccount, vpt.LL6 
ORDER BY OGL.PayrollAccount, vpt.LL6 

即Appy SUMCASE声明提取您需要的组。

+0

我碰巧使用戈登的例子,但这看起来差不多相同 – mrshickadance

+0

是的,几乎是相同的想法。他殴打我几秒钟的答案,所以只有公平的他才能得到公认的答案。感谢更新! –