Как посчитать и выбрать все записи на основе месяца, в котором нет данных

#mysql #database #datetime #count #null

#mysql #База данных #дата и время #подсчет #null

Вопрос:

У меня есть таблица с именем tbl_remit.

 id   emp_id    comp_name    e_from       e_to         amount
1     123      a            2016-01-01   2016-01-31   10.00
2     123      a            2016-02-01   2016-02-29    5.00
3     123      a            2016-03-01   2016-03-31   20.00
4     456      b            2016-02-01   2016-02-29   50.00
5     789      c            2016-02-01   2016-02-29   10.00
6     789      c            2016-03-01   2016-03-31   15.00
  

Мне нужно посчитать и выбрать все emp_id, которые не платили с 2016-01-01 по 2016-01-31.

всего работодателей: 3 всего работодателей, которые не платили с (2016-01-01 по 2016-01-31): 2

 id   emp_id    comp_name    
1     456      b            
2     789      c            
  

Есть ли какой-нибудь способ посчитать, где нет данных? это утверждение, которое я использовал в этом заявлении.

 SELECT COUNT(PEN) FROM view_remit WHERE E_FROM != '"amp; varDateFrom amp;"' AND E_TO != '"amp; varDateTo amp;"' AND Assigned_ACCOUNT = '"amp; varAssignedAccount amp;"'
  

Извините за этот вопрос новичка.

Комментарии:

1. что вы подразумеваете под тем, что нет данных, означает, что идентификатор 123 отсутствует во второй таблице?

2. я имею в виду, что это только в одной таблице. мне нужно посчитать emp_id тех, кто не платил с 2016-01-01 по 2016-01-31.

Ответ №1:

Если у вас есть только эта таблица, вы можете получить эти данные, используя отрицательное совпадение в подзапросе:

 SELECT DISTINCT emp_id, comp_name
  FROM tbl_remit
  WHERE emp_id NOT IN 
    (SELECT emp_id 
      FROM tbl_remit
      WHERE (e_from <= '2016-01-31' AND e_to >= '2016-01-01')
    )
  

Сначала подзапрос выбирает все emp_id из строк из tbl_remit, которые относятся к рассматриваемому периоду времени. Затем вы запрашиваете те emp_id, которых нет в этом наборе.

Этот запрос не будет показывать emp_id тех, кто никогда ничего не платил. Если у вас есть отдельная таблица, содержащая возможные emp_id, вы также можете использовать эту таблицу в качестве основного запроса и сопоставить emp_id с данными в подзапросе tbl_remit.

Комментарии:

1. Боже мой! Большое вам СПАСИБО, СЭР! Я не знал, как использовать «DISTICNT» и «NOT IN» в одном заявлении. Это очень помогло моему коду. большое вам спасибо

2. Боже мой! Большое вам СПАСИБО, СЭР! Я не знал, как использовать «DISTICNT» и «NOT IN» в одном заявлении. Это очень помогло моему коду.

Ответ №2:

ВЫБЕРИТЕ DISTINCT emp_id,comp_name ИЗ tbl_remit, где e_from<= ‘2016-01-01’ И e_from>= ‘2016-01-31’;