Неверное количество записей в SQL-запросе - PullRequest
0 голосов
/ 06 сентября 2018

Я написал нижеприведенный запрос, мне нужно подготовить список в графическом интерфейсе, где мне нужно показать количество записей, теперь мои записи равны 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)

Я что-то упустил? Пожалуйста, предложите мне лучшее решение

Ответы [ 4 ]

0 голосов
/ 06 сентября 2018

Поскольку некоторые строки 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

Результаты :

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

Запрос 2 :

SELECT COUNT(DISTINCT col1)
FROM T

Результаты

| COUNT(DISTINCTCOL1) |
|---------------------|
|                   2 |
0 голосов
/ 06 сентября 2018

В первом запросе перечислены строки, которые различны во всех выбранных столбцах . Второй запрос подсчитывает различные значения в одном столбце E.EMP_CODE.

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

Две отдельные строки для первого запроса, но только одна отдельная E.EMP_CODE для count.

0 голосов
/ 06 сентября 2018

может быть, у вас есть дублирующиеся значения 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 возвращает только количество значений difnet в столбцах

0 голосов
/ 06 сентября 2018

вы можете использовать group by, потому что в вашем 1-м запросе группировка различается, поэтому примените то же самое во 2-м запросе и

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...