2013-08-21 180 views
0

我有一个用于从SQL数据库中导出数据的C#应用​​程序。它从视图中提取数据并将其导出到Excel中,以导入到我们的工资系统。我需要计算加班金额。我有下面的代码,但它不计算加班的数量。我已经搜索了互联网寻求解决方案,但没有任何运气。 this is the out put I get如何根据行的总和计算值以获得值

SELECT [Co Code] 
    , [Empl No] 
    , [Task CD] 
    , [Day No] 
    , [Fund Co Code] 
    , [Job No] 
    , [Equip Cost Cde] 
    , SUM([Reg Hrs Jc]) AS [Reg Hrs Jc] 
    ,(CASE WHEN [Reg Hrs Jc] > 40 THEN [Reg Hrs Jc] - 40 ELSE 0 END) AS [Ot Hrs Jc] 
FROM   dbo.MIS_FTTIMECARD_OT 
WHERE  ([Date Worked] BETWEEN '8/11/2013' AND '8/17/2013') 
GROUP BY [Co Code] 
    , [Empl No] 
    , [Task CD] 
    , [Day No] 
    , [Fund Co Code] 
    , [Job No] 
    , [Equip Cost Cde] 
    , (CASE WHEN [Reg Hrs Jc] > 40 THEN [Reg Hrs Jc] - 40 ELSE 0 END) 
+0

您不能提供足够的信息。更多地解释你的数据,每个员工每周或每天都有一行。你是否想要获得每位员工的总小时数?只是列出表格定义并给出一些很好的样本数据。另外,如果您的列名中没有空格,则不需要遍布各处的令人讨厌的[大括号]。 –

+2

看起来你是基于你的加班标准的基础上,而不是值的总和。此外,这种事情,sum(fieldname)作为fieldname往往会导致问题。我建议使用不同的别名。 –

回答

0

你应该使用子查询,这将让您先总结的时间量工作的工作:

SELECT t.*, (CASE WHEN [Reg Hrs Jc] > 40 THEN [Reg Hrs Jc] - 40 ELSE 0 END) AS [Ot Hrs Jc] 
FROM 
    (SELECT [Co Code], [Empl No], [Task CD], [Day No], [Fund Co Code], [Job No], [Equip Cost Cde], SUM([Reg Hrs Jc]) AS [Reg Hrs Jc] FROM dbo.MIS_FTTIMECARD_OT 
    WHERE ([Date Worked] BETWEEN '8/11/2013' AND '8/17/2013') 
    GROUP BY [Co Code], [Empl No], [Task CD], [Day No], [Fund Co Code], [Job No], [Equip Cost Cde]) AS t 
+0

非常感谢你的工作。我试图使用子查询,但没有正确的格式,我猜。再次感谢。 –

0

扩展其他的答案,你的命名约定可能是什么导致了混乱。

考虑您的代码下面的代码片段:

, SUM([Reg Hrs Jc]) AS [Reg Hrs Jc] 
,(CASE WHEN [Reg Hrs Jc] > 40 THEN [Reg Hrs Jc] - 40 ELSE 0 END) AS [Ot Hrs Jc] 

通过重命名,很清楚发生了什么:

, SUM([Reg Hrs Jc]) AS [Reg Hrs Jc Sum] 
,(CASE WHEN [Reg Hrs Jc] > 40 THEN [Reg Hrs Jc] - 40 ELSE 0 END) AS [Ot Hrs Jc] 

我想你已经有效地试图做到以下几点,这是行不通的如果它没有共享一个实际的列名

, SUM([Reg Hrs Jc]) AS [Reg Hrs Jc Sum] 
,(CASE WHEN [Reg Hrs Jc Sum] > 40 THEN [Reg Hrs Jc Sum] - 40 ELSE 0 END) AS [Ot Hrs Jc] 

你不能昵称一个公司然后在同一范围内通过新标题引用它,所以您应该像其他人所建议的那样,将Ot Hrs Jc作为SUM([Reg Hrs Jc])的基础。