2017-02-14 10 views
0

Вот обновление моего query on SQL FiddleВозвращать все записи с COUNT = 0

Я хочу, чтобы все записи, даже если столбец nbDemandes является 0, для каждого nomLoi (RRQ и SAE).

Таким образом, фактический результат:

nomTypeDemande | nomLoi | nbDemandes 
--------------- -------- ----------- 
Chef équipe  RRQ   2 
Mandat Projet  SAE   4 
PO    RRQ   5 
PO    SAE   1 

желаемый результат:

nomTypeDemande | nomLoi | nbDemandes 
--------------- -------- ----------- 
Chef équipe  RRQ   2 
Chef équipe  SAE   0 
Mandat Projet  RRQ   0 
Mandat Projet  SAE   4 
PO    RRQ   5 
PO    SAE   1 

спасибо еще раз, чтобы помочь мне :)

ответ

1

Заменит первые INNER JOIN сек на RIGHT JOIN/ LEFT JOIN:

SELECT normesTypesDemande.choix AS nomTypeDemande, 
    normesLois.choix AS nomLoi, 
    COUNT(*) as nbDemandes 
FROM ((gestionDemandes.typeNormes 
    RIGHT JOIN gestionDemandes.normesLois 
     ON typeNormes.loi = normesLois.id) 
    LEFT JOIN gestionDemandes.normesTypesDemande 
     ON typeNormes.typeDemande = normesTypesDemande.id) 
    LEFT JOIN gestionDemandes.demandes 
     ON typeNormes.demande = demandes.id 
GROUP BY normesTypesDemande.choix, normesLois.choix 
ORDER BY normesTypesDemande.choix 

Из-за этого INNER JOIN и нет соответствующих строк для подсчета Comité - SAE, например, INNER JOIN будет фильтровать строку SAE.

Изменение этого параметра на RIGHT JOIN будет гарантировать, что данные не будут удалены из normesLois, и вы должны иметь счет 0.

Update:

Ну, не самый изящный, но вот решение:

SELECT nomTypeDemande 
    , choix 
    , sum(nbDemandes) AS nbDemandes 
FROM (
    SELECT r.nomTypeDemande 
     , nl.choix 
     , CASE 
      WHEN r.nomLoi = nl.choix 
       THEN sum(r.nbDemandes) 
      ELSE 0 
      END AS nbDemandes 
    FROM (
     SELECT normesTypesDemande.choix AS nomTypeDemande 
      , normesLois.choix AS nomLoi 
      , COUNT(typeNormes.id) AS nbDemandes 
     FROM normesLois 
     FULL JOIN typeNormes 
      ON typeNormes.loi = normesLois.id 
     FULL JOIN normesTypesDemande 
      ON typeNormes.typeDemande = normesTypesDemande.id 
     GROUP BY normesTypesDemande.choix 
      , normesLois.choix 
     ) r 
    CROSS JOIN normesLois nl 
    GROUP BY r.nomTypeDemande 
     , nl.choix 
     , r.nomLoi 
    ) r 
GROUP BY nomTypeDemande 
    , choix 
ORDER BY nomTypeDemande 
    , choix 
+0

привет сэр, я попытался это, но не разница вообще ... :( – Patix80

+0

@ Patix80 Можете ли вы повторить сейчас? –

+0

Да, я еще раз попробовал, но тот же результат ... Есть (0), например, – Patix80

0

Насколько я догадываюсь, вы рассчитываете demandés и категоризацию. Проблема в том, что нет спроса на определенную категорию, которую они не будут присутствовать, чтобы ее пересчитать в любом случае.

Решение может быть левым соединением по запросу, так что все [normesLois] и [normesTypesDemande] будут возвращены, даже если нет запросов от этого типа.

SELECT normesTypesDemande.choix AS nomTypeDemande, 
     normesLois.choix AS nomLoi, 
     COUNT(typeNormes.id) as nbDemandes 
FROM gestionDemandes.typeNormes 
INNER JOIN gestionDemandes.normesLois ON typeNormes.loi = normesLois.id 
INNER JOIN gestionDemandes.normesTypesDemande ON typeNormes.typeDemande = normesTypesDemande.id 
LEFT JOIN gestionDemandes.demandes ON typeNormes.demande = demandes.id 
GROUP BY normesTypesDemande.choix, normesLois.choix 
ORDER BY normesTypesDemande.choix 

PS: Вы действительно не нужно, что дополнительные parentesis на стыки

+0

спасибо за ответ так быстро и за PS :). Но не разница для возвращенных записей. – Patix80

+0

@ Patix80 Возможно, нам не хватает детали здесь. Если вы опубликуете проверяемый пример, вы можете получить более настойчивые ответы. Рассмотрим, например, использование [SQLfiddle] (http://sqlfiddle.com/). Повторите попытку, используя только LEFT-соединения, возможно, вы пропустили совпадение normesLois] и [normesTypesDemande] – jean

+0

OK спасибо за трюк. Я попробую это ... – Patix80

0

Вы должны изменить внутреннее направо присоединиться попробовать ниже запрос.

SELECT 
      T3.choix AS nomTypeDemande, 
      T2.choix AS nomLoi, 
      COUNT(T1.id) as nbDemandes 
    FROM gestionDemandes.typeNormes T1 
      RIGHT JOIN gestionDemandes.normesLois T2 ON T1.loi = T2.id 
      RIGHT JOIN gestionDemandes.normesTypesDemande T3 ON T1.typeDemande = T3.id 
      INNER JOIN gestionDemandes.demandes T4 ON T1.demande = T4.id 
    GROUP BY T3.choix, T2.choix 
    ORDER BY T3.choix 
+0

Я пробовал ваш запрос, но желаемый результат был не тем, что ему нужно быть... – Patix80

 Смежные вопросы

  • Нет связанных вопросов^_^