【问题标题】:SQL - SELECT on table with multiple rows doubling resultSQL - 在表上选择多行结果加倍
【发布时间】:2023-03-24 13:44:01
【问题描述】:

我有一个问题,我从两个表中进行选择,如下所示:

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,但由于(我认为)payment_capture 中的两行,它返回 56(下)。

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

非常感谢。

weekly_hours           var_cash
---------------------- ----------------------
56                     64.23

【问题讨论】:

  • 你为什么使用像'17 June, 2012'这样的日期文字?请使用不受 SQL Server 基于语言和其他设置的不同解释的明确格式。 '20120617' 更安全。
  • 在不了解系统设计的情况下,很难知道这是否是正确的方法,但根据我们所知道的情况,您应该使用子查询来汇总 payment_capture 中的数据,然后在 time_capture 的外部查询中加入子查询。
  • 如果当天有两名员工有时间,您希望结果如何? time_capture 表中的 emp_no / Effective_date 组合是否可以有两行?

标签: sql sql-server join left-join


【解决方案1】:

您需要为此使用子查询预先汇总您的现金:

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)

【讨论】:

    【解决方案2】:

    它读对了。由于您正在进行连接,因此它正在返回:

     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

    【讨论】:

    • 嗯,这描述了为什么结果有问题,但我有点期待您继续查询,得到正确的结果?
    • 看起来需要 MAX - 看起来像非规范化数据库表中的冗余
    • 为什么需要这样设置查询?为什么没有 2 个查询,1 个对房子求和,1 个对 var_cash 求和。这样你就不用担心了。我的意思是,您可以四处走动并将这两个项目组合在一个子选择中,因为您可以单独执行它们。如:Select A.hours, B.var_cash from (Select sum(A.hours) from A) join (Select sum(B.var_cash) from B) on A.emp_no = B.emp_no where effective_date = @date;我没有运行查询,但既然你可以有 2 个单独的查询来执行此操作,为什么不形成 2 个查询来完成这两个部分,然后在顶层打印出来。
    猜你喜欢
    • 1970-01-01
    • 2020-11-22
    • 2011-09-29
    • 2021-12-18
    • 2018-01-19
    • 2021-02-21
    • 1970-01-01
    • 2017-05-13
    • 1970-01-01
    相关资源
    最近更新 更多