【问题标题】:Wrong count of records in SQL querySQL 查询中的记录计数错误
【发布时间】:2018-09-06 07:59:02
【问题描述】:

我写了一个下面提到的查询,我需要在 GUI 中准备列表,我需要显示总记录的计数,现在我的记录是 119,这是正确的,但是当我应用计数函数时它变成 115。我想知道为什么会这样。

SELECT distinct E.EMP_CODE,
  a.EMP_ID,
  e.name,
  E.ADHAR_NO,
  a.CURRENT_STATUS,
  D.NAME
FROM ACR a
JOIN EMPLOYEE E
ON E.EMP_ID=a.EMP_ID
JOIN DESIGNATION D
ON D.DESIGNATION_ID      =E.DESIGNATION_ID
AND e.EMP_TYPE_ID NOT   IN(02,03,04,06,08)
AND (e.DESIGNATION_ID   IN (23,99)
OR d.DESIGNATION_CLASS IN(1,2))
AND (e.relief_type      IS NULL
OR e.RELIEF_TYPE         = 4)
JOIN REGION R
ON R.REGION_ID=E.REGION_ID
LEFT JOIN CIRCLE C
ON C.CIRCLE_ID       =E.CIRCLE_ID
WHERE ACR_FOR_SESSION='2017-2018'
AND E.CIRCLE_ID     IS NULL
AND E.REGION_ID      =1
AND a.CURRENT_STATUS>1

总记录列表为119

现在应用计数超过DISTINCT E.EMP_CODE

SELECT count(distinct E.EMP_CODE)
FROM ACR a
JOIN EMPLOYEE E
ON E.EMP_ID=a.EMP_ID
JOIN DESIGNATION D
ON D.DESIGNATION_ID      =E.DESIGNATION_ID
AND e.EMP_TYPE_ID NOT   IN(02,03,04,06,08)
AND (e.DESIGNATION_ID   IN (23,99)
OR d.DESIGNATION_CLASS IN(1,2))
AND (e.relief_type      IS NULL
OR e.RELIEF_TYPE         = 4)
JOIN REGION R
ON R.REGION_ID=E.REGION_ID
LEFT JOIN CIRCLE C
ON C.CIRCLE_ID       =E.CIRCLE_ID
WHERE ACR_FOR_SESSION='2017-2018'
AND E.CIRCLE_ID     IS NULL
AND E.REGION_ID      =1
AND a.CURRENT_STATUS>1

Output: 115 (Wrong)

我错过了什么吗?请建议我最好的解决方案

【问题讨论】:

  • 只需从计数中删除不同的关键字
  • 可能是你有一些重复的 e.emp_code 值..,例如:一个 emp_code 有更多的行..
  • 是的,我确实有一些员工的两条记录,但我只需要计算该员工一次

标签: sql oracle oracle11g oracle-sqldeveloper


【解决方案1】:

第一个查询列出了在所有选定列中都不同的行。第二个查询计算单个列 E.EMP_CODE 中的不同值。

E.EMP_CODE A.EMP_ID ...
1          2        ...
1          3        ...

第一个查询有两个不同的行,但count 只有一个不同的E.EMP_CODE

【讨论】:

  • 我如何代表 a.EMP_Id 和 e.EMPCODE 计算行数
  • 太好了,您是准确识别问题的人,非常感谢您
【解决方案2】:

因为在E.EMP_CODE 中有相同的行E.EMP_CODE。当您使用 count(distinct E.EMP_CODE) 时,只需从 E.EMP_CODE 中删除相同的值,然后获取 COUNT 数字

但是当你使用

distinct E.EMP_CODE,
  a.EMP_ID,
  e.name,
  E.ADHAR_NO,
  a.CURRENT_STATUS,
  D.NAME

将删除所有这些相同的值。

这是一个示例。

CREATE TABLE T(col1 varchar(50),col2 varchar(50));

INSERT INTO T VALUES ('A','B'); 
INSERT INTO T VALUES ('A','B1'); 
INSERT INTO T VALUES ('AB','B3'); 

查询 1

SELECT DISTINCT * 
FROM T

Results

| COL1 | COL2 |
|------|------|
|    A |   B1 |
|    A |    B |
|   AB |   B3 |

查询 2

SELECT COUNT(DISTINCT col1)
FROM T

Results

| COUNT(DISTINCTCOL1) |
|---------------------|
|                   2 |

【讨论】:

  • 解释得很好,对我很有帮助
  • @user9634982 没问题很高兴帮助
【解决方案3】:

您可以使用 group by ,因为在您的第一个查询中分组区分,所以在第二个查询中也应用相同

select sum(cnt)  from
        (
       SELECT count(E.EMP_CODE) as cnt
        FROM ACR a
        JOIN EMPLOYEE E
        ON E.EMP_ID=a.EMP_ID
        JOIN DESIGNATION D
        ON D.DESIGNATION_ID      =E.DESIGNATION_ID
        AND e.EMP_TYPE_ID NOT   IN(02,03,04,06,08)
        AND (e.DESIGNATION_ID   IN (23,99)
        OR d.DESIGNATION_CLASS IN(1,2))
        AND (e.relief_type      IS NULL
        OR e.RELIEF_TYPE         = 4)
        JOIN REGION R
        ON R.REGION_ID=E.REGION_ID
        LEFT JOIN CIRCLE C
        ON C.CIRCLE_ID       =E.CIRCLE_ID
        WHERE ACR_FOR_SESSION='2017-2018'
        AND E.CIRCLE_ID     IS NULL
        AND E.REGION_ID      =1
        AND a.CURRENT_STATUS>1
       group by 
       a.EMP_ID,
      e.name,
      E.ADHAR_NO,
      a.CURRENT_STATUS,
      D.NAME
      ) t

【讨论】:

  • 如果我删除不同的关键字,它将获取 140 条记录
  • @user9634982 您可以使用第一个查询选择列表中的分组方式
  • 非常感谢,我实现了 group by 并总结了计数,得到了预期的输出,我使用了你和 Jiri 的组合解决方案
  • @user9634982 如果有帮助,请接受答案以示感谢
  • @Zyanul 我很欣赏你的解决方案,还有一件事你有一个非常美丽的名字玛莎阿拉
【解决方案4】:

可能你有一些重复的 e.emp_code 值..,例如:一个 emp_code 有更多的行

尽量避免不同的计数

  SELECT count(E.EMP_CODE)
  FROM ACR a
  JOIN EMPLOYEE E
  ON E.EMP_ID=a.EMP_ID
  JOIN DESIGNATION D
  ON D.DESIGNATION_ID      =E.DESIGNATION_ID
  AND e.EMP_TYPE_ID NOT   IN(02,03,04,06,08)
  AND (e.DESIGNATION_ID   IN (23,99)
  OR d.DESIGNATION_CLASS IN(1,2))
  AND (e.relief_type      IS NULL
  OR e.RELIEF_TYPE         = 4)
  JOIN REGION R
  ON R.REGION_ID=E.REGION_ID
  LEFT JOIN CIRCLE C
  ON C.CIRCLE_ID       =E.CIRCLE_ID
  WHERE ACR_FOR_SESSION='2017-2018'
  AND E.CIRCLE_ID     IS NULL
  AND E.REGION_ID      =1
  AND a.CURRENT_STATUS>1

distint count 只返回列中不同值的个数

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-01
    • 2011-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-12
    • 1970-01-01
    相关资源
    最近更新 更多