【问题标题】:Confused on count(*) and self joins对计数(*)和自连接感到困惑
【发布时间】:2010-09-14 15:59:39
【问题描述】:

我想返回当月和当年的所有申请日期。这一定很简单,但是我想不通。我知道当月有 2 个日期,当年有 90 个日期。右,左,外,内我都试过了,只是把代码扔在墙上,想看看什么会粘住,但都不起作用。我要么两列得到 2,要么两列得到 180。这是我最新的选择声明。

SELECT count(a.evdtApplication) AS monthApplicationEntered,  
       count (b.evdtApplication) AS yearApplicationEntered
FROM tblEventDates a 
RIGHT OUTER JOIN tblEventDates b ON a.LOANid = b.loanid 
WHERE datediff(mm,a.evdtApplication,getdate()) = 0 
      AND datediff(yy,a.evdtApplication, getdate()) = 0 
      AND datediff(yy,b.evdtApplication,getdate()) = 0 

【问题讨论】:

    标签: sql join self-join


    【解决方案1】:

    您根本不需要任何连接。

    您想计算 tblEventDates 中的 loanID 列,并且您想根据与当前月份或当年匹配的日期有条件地执行此操作。

    所以:

    SELECT SUM( CASE WHEN Month(a.evdtApplication) = MONTH(GEtDate() THEN 1 END) as monthTotal,
            count(*)
    FROM tblEventDates a
    WHERE a.evdtApplication BETWEEN '2008-01-01' AND '2008-12-31'
    

    这样做是选择今年的所有活动日期,并将符合您条件的日期相加。如果它与当前月份不匹配,则不会加 1。实际上,甚至不需要为年份做条件,因为您只是查询该年份的所有内容。

    【讨论】:

    • 希望2008-12-31中午没有申请。
    • 糟糕。好吧,这就是您在没有测试的情况下编写的快速示例所得到的。这就是我们测试的原因!
    • Telos 感谢您的快速响应和 Dave 指出了一个很好的测试。
    猜你喜欢
    • 1970-01-01
    • 2021-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多