2012-06-25 79 views
1

我在那里,我从两个表中选择一个问题如下表:SQL - 选择多行加倍结果

select SUM(tc.WEEKLY_HOURS), 
      SUM(pc.var_cash) 
from time_capture tc 
LEFT OUTER JOIN PAYMENT_CAPTURE pc on tc.EMP_NO = pc.emp_no 
                 AND tc.EFFECTIVE_DATE = pc.EFFECTIVE_DATE 
where tc.effective_date = '17 June, 2012' 
GROUP BY LEFT(tc.COST_CENTRE, 4) 

两个表包含:

time_capture

emp_no  EFFECTIVE_DATE   weekly_hours 
---------- ----------------------- ---------------------- 
1234  2012-06-17    28 

PAYMENT_CAPTURE

emp_no  EFFECTIVE_DATE   INPUT_CODE cost_centre    var_cash 
---------- ----------------------- ---------- ------------------------- ---------------------- 
1234  2012-06-17    KEY  5607.03     45 
1234  2012-06-17    OTHER  5607.03     19.23 

我期待sum(weekly_hours)返回28,但它返回56(下面),因为(我认为)payment_capture中的两行。

有人能指出我在这个方向上的正确方向吗?

非常感谢。

weekly_hours   var_cash 
---------------------- ---------------------- 
56      64.23 
+2

为什么你使用日期字面量''17六月,2012''?请根据语言和其他设置使用明确的格式,这些格式不受SQL Server的不同解释。 ''20120617''更安全。 –

+1

不知道更多的系统设计很难知道这是否是正确的方法,但基于我们知道它出现您应该使用子查询来汇总payment_capture中的数据,然后加入到外层的子查询中查询time_capture。 –

+0

如果你有两名员工在那一天的时间,你想要结果是什么?并且time_capture表中的emp_no/effective_date组合可以有两行吗? –

回答

2

你需要预先汇总的这个使用子查询现金:

select 
    SUM(tc.WEEKLY_HOURS) as 'Hrs', 
    SUM(pc.var_cash) as 'Cash' 
from  
    time_capture tc 
LEFT OUTER JOIN 
    (
    SELECT 
     Emp_No, 
     Effective_Date, 
     SUM(var_cash) as 'var_cash' 
    FROM 
     PAYMENT_CAPTURE) 
    pc 
     on tc.EMP_NO = pc.emp_no 
     AND tc.EFFECTIVE_DATE = pc.EFFECTIVE_DATE 
where 
    tc.effective_date = '17 June, 2012' 
GROUP BY L 
    EFT(tc.COST_CENTRE, 4) 
+0

就是这样 - 非常感谢所有人。感谢帮助/建议。 – aphrek

1

它正在阅读正确。既然你正在做一个连接,它返回:

1234 | 2012-06-07 | 28 | 1234 | 2012-06-07 | 5607.03 | 45 

1234 | 2012-06-07 | 28 | 1234 | 2012-06-07 | 5607.03 | 19.23 

因此,既然你正在总结,你会得到28 + 28 = 56和45 + 19.23 = 64.23

+1

嗯,这是描述为什么结果有问题,但我期待你继续查询,得到正确的结果? –

+0

看起来像一个MAX是必需的 - 看起来像一个非标准化的数据库表中的冗余 – Charleh

+0

为什么需要这样设置查询?为什么不有2个查询,1个房子和1个总和var_cash。这样你就不必担心它。我的意思是,你可以勉强周旋,并将这两个项目结合起来,因为你可以单独做这些事情。 例如:从A中选择A.hours,B.var_cash(从A中选择sum(A.hours))join(从B中选择sum(B.var_cash))A.emp_no = B.emp_no其中effective_date = @date ;我没有运行查询,但因为你可以有2个单独的查询这样做,为什么不形成2个查询哪些将做两个部分,然后顶级打印出来。 – Fallenreaper