Условие SQL только для 1 столбца

#mysql #sql #where-clause

#mysql #sql #where-предложение

Вопрос:

Я изо всех сил пытаюсь найти, как я могу поместить условие where только в 1 столбец.

Подводя итог, я хочу иметь столбец всех заявок в базе данных и другой столбец всех заявок с заданной датой.

Мой SQL-запрос :

 SELECT
  i.created AS creation, l.label AS activite, 
  COUNT(l.label) AS nbTicket, COUNT(l.label) AS nbEntree
FROM label AS l INNER JOIN
     jiraissue AS i
     ON (l.issue = i.id) AND i.issuetype <> 3
GROUP BY activite
  

Итак, здесь у меня есть все заявки из базы данных, но если бы у меня было условие where с датой :

 SELECT l.label AS activite, SUM(i.timespent/3600/8) AS consomme, SUM(i.timeestimate/3600/8) AS raf, COUNT(l.label) AS nbTicket, 
    SUM(i.timeoriginalestimate/3600/8) AS chargeProvisoire, COUNT(l.label) AS nbEntree 
    FROM label AS l INNER JOIN jiraissue AS i ON (l.issue = i.id)  
    WHERE l.label IN ('Devis','TGC1','TGC2','TGC3','TGC4','TGC5','TGC5-Bis','TGC6','TGC7','TGC8','TGC8-Bis','TGC9','TGC10','TGC10-Bis','TGC12','TGC13','TGC13-Bis','TGC14','TGC50','TGC60')
    AND i.issuetype <> 3 AND i.created LIKE "2014-01-%" GROUP BY activite
  

У меня есть только билет на январь 2019 года.

Является ли их решением наличие всех билетов в столбце ==> nbTicket и всех билетов с предложением ‘where’ в столбце ==> nbEntree?

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

1. i.created AS creation может содержать недопустимые (несоответствующие) данные, потому что это приводит к тому, что вы используете GROUP BY недопустимым образом

2. да, я вижу это, но запрос работает, я просто удаляю информацию, потому что она была слишком длинной

3. Обычно вы ГРУППИРУЕТЕСЬ ПО тем же столбцам, которые вы ВЫБИРАЕТЕ, за исключением тех, которые являются аргументами для функций set.

4. я отредактировал свой sql

5. @RaymondNijland Спасибо. Это положило начало хорошей дискуссии. Чтобы выяснить, почему я был так против этой функции, я только что протестировал ее на MySQL 5.5, MySQL 8.0, MariaDB 10.0 и MariaDB 10.3 (последняя версия). Судя по моим локальным тестам, это безопасно только в MySQL 8.0. Я предполагаю, что MySQL имеет преимущество в этом вопросе по сравнению с MariaDB.

Ответ №1:

Вы можете использовать условие SUM() в первом запросе, как в:

 SELECT
  max(i.created) AS creation,
  l.label AS activite, 
  COUNT(*) AS nbTicket,
  SUM(case when i.created LIKE "2019-01-%" then 1 end) AS nbEntree
FROM label AS l INNER JOIN
     jiraissue AS i
     ON (l.issue = i.id) AND i.issuetype <> 3
GROUP BY activite
  

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

1. Спасибо, я отлично справился с тем, что мне было нужно