SQL 连接不正确
SQL not doing the join correctly
我有一个带有一些 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[=20= 的 EMPLID
计数] 在加入条件中,有帮助吗?
COUNT()
(and also the other GROUP BY
aggregate functions) 不只处理其中一个表中的行。
它们处理 JOIN
生成的所有行。如果没有 GROUP BY
的 JOIN
产生 42 行,那么 COUNT(*)
和 COUNT(1)
returns 42
而 COUNT(A.EMPLID)
和 COUNT(D.EMPLID)
return 这些列中非 NULL
值的数量。
为了获得从其中一个表中提取的行数,您应该使用 COUNT(DISTINCT)
。它忽略 NULL
值以及 JOIN
.
产生的重复项
将 COUNT(D.EMPLID)
更改为 COUNT(DISTINCT D.EMPLID)
。
我有一个带有一些 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[=20= 的 EMPLID
计数] 在加入条件中,有帮助吗?
COUNT()
(and also the other GROUP BY
aggregate functions) 不只处理其中一个表中的行。
它们处理 JOIN
生成的所有行。如果没有 GROUP BY
的 JOIN
产生 42 行,那么 COUNT(*)
和 COUNT(1)
returns 42
而 COUNT(A.EMPLID)
和 COUNT(D.EMPLID)
return 这些列中非 NULL
值的数量。
为了获得从其中一个表中提取的行数,您应该使用 COUNT(DISTINCT)
。它忽略 NULL
值以及 JOIN
.
将 COUNT(D.EMPLID)
更改为 COUNT(DISTINCT D.EMPLID)
。