【问题标题】:SQL not doing the join correctlySQL 未正确执行连接
【发布时间】:2015-06-12 14:23:35
【问题描述】:

我有一个带有一些 JOIN 条件的 SQL 语句,它对所有语句都可以正常工作,但不是最后一个,代码如下:

SELECT 
    A.EMPL_CTG, 
    B.DESCR AS PrName, 
    SUM(A.CURRENT_COMPRATE) AS SALARY_COST_BUDGET, 
    SUM(A.BUDGET_AMT) AS BUDGET_AMT, 
    SUM(A.BUDGET_AMT)*100/SUM(A.CURRENT_COMPRATE) AS MERIT_GOAL,
    SUM(C.FACTOR_XSALARY) AS X_Programp, 
    SUM(A.FACTOR_XSALARY) AS X_Program,
    COUNT(A.EMPLID) AS EMPL_CNT, 
    COUNT(D.EMPLID),
    SUM(CASE WHEN A.PROMOTION_SECTION = 'Y' THEN 1 ELSE 0 END) AS PRMCNT,
    SUM(CASE WHEN A.EXCEPT_IND = 'Y' THEN 1 ELSE 0 END) AS EXPCNT, 
    (SUM(CASE WHEN A.PROMOTION_SECTION = 'Y' THEN 1 ELSE 0 END)+SUM(CASE WHEN A.EXCEPT_IND = 'Y' THEN 1 ELSE 0 END))*100/(COUNT(A.EMPLID)) AS PEpercent 
FROM 
    EMP_DTL A INNER JOIN EMPL_CTG_L1 B ON A.EMPL_CTG = B.EMPL_CTG  
    INNER JOIN 
    ECM_PRYR_VW C ON A.EMPLID=C.EMPLID 
    INNER JOIN ECM_INELIG  D on D.EMPL_CTG=A.EMPL_CTG and D.YEAR=YEAR(getdate()) 
WHERE 
    A.YEAR=YEAR(getdate()) 
    AND B.EFF_STATUS='A' 
GROUP BY 
    A.EMPL_CTG, 
    B.DESCR 
ORDER BY B.DESCR

COUNT(D.EMPLID) 返回与 COUNT(A.EMPLID) 相同的值,但我需要在连接条件中为 Table D 计算 EMPLIDs 的计数,有什么帮助吗?

【问题讨论】:

  • 你能分享一些样本数据并解释你想要得到什么结果吗?
  • 你遇到了什么错误?
  • COUNT()(以及另一个GROUP BY aggregate functions)不只处理其中一个表中的行。它们处理JOIN 生成的所有行。 COUNT(A.EMPLID)COUNT(D.EMPLID) 之间的唯一区别在于两列中的 NULL 值。您应该使用COUNT(DISTINCT D.EMPLID) 来获取您需要的值。
  • 没有错误,查询运行良好,但作为示例数据,可以说 EMPL_CNT 应该是 42,并且 COUNT(D.EMPLID)=3 ,但查询返回:EMPL_CNT =42 和 COUNT(D.EMPLID)=42
  • axiac,是的,你是对的,感谢您的帮助,工作就像一个魅力

标签: sql-server inner-join


【解决方案1】:

COUNT()(以及另一个GROUP BY aggregate functions)不只处理其中一个表中的行。

它们处理JOIN 生成的所有行。如果没有 GROUP BYJOIN 产生 42 行,则 COUNT(*)COUNT(1) 返回 42COUNT(A.EMPLID)COUNT(D.EMPLID) 返回这些列中非 NULL 值的数量。

为了获得从其中一张表中提取的行数,您应该使用COUNT(DISTINCT)。它会忽略NULL 值以及JOIN 产生的重复值。

COUNT(D.EMPLID) 更改为COUNT(DISTINCT D.EMPLID)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-12
    • 2019-05-10
    • 2015-04-17
    • 2023-03-25
    • 2014-03-13
    • 2020-05-11
    • 1970-01-01
    相关资源
    最近更新 更多