2017-10-16 14 views
-1

J'ai deux tables. Ma requête devrait retourner ce qui suit:Renvoie 0 et non NULL lorsque l'enregistrement n'est pas trouvé à l'aide de la jointure externe gauche

AUT | 0 

mais cela ne retourne rien. J'ai essayé ce qui suit ci-dessous, mais rien ne fonctionne.

select substr(s.initial_group_code,1,3) as ko_tun, ifnull(count(s.id),0) 
from study_entitlement s 
left outer join graduation_status g on g.study_entitlement_id = s.id 
where g.graduation_status_date between str_to_date('01.01.2017', '%d.%m.%Y') 
    and str_to_date('31.01.2017', '%d.%m.%Y') 
and substr(s.initial_group_code,1,3) = 'AUT' 
group by substr(s.initial_group_code,1,3); 
select substr(s.initial_group_code,1,3) as ko_tun, count(s.id)+0 
from study_entitlement s 
left outer join graduation_status g on g.study_entitlement_id = s.id 
where g.graduation_status_date between str_to_date('01.01.2017', '%d.%m.%Y') 
    and str_to_date('31.01.2017', '%d.%m.%Y') 
and substr(s.initial_group_code,1,3) = 'AUT' 
group by substr(s.initial_group_code,1,3); 
select substr(s.initial_group_code,1,3) as ko_tun, COALESCE(count(s.id),0) 
from study_entitlement s 
left outer join graduation_status g on g.study_entitlement_id = s.id 
where substr(s.initial_group_code,1,3) = 'AUT' 
and g.graduation_status_date between str_to_date('01.01.2017', '%d.%m.%Y') 
    and str_to_date('31.01.2017', '%d.%m.%Y') 
group by substr(s.initial_group_code,1,3); 
+0

S'il vous plaît formater votre code avec l'éditeur de sorte qu'il est plus facile de dire qui est qui. – kchason

+0

Etes-vous certain que le groupe 'AUT' existe réellement dans votre ensemble de données? Vous devrez peut-être utiliser la table d'agenda ici. –

+0

Je ne vois pas le problème ici, en ce que les deux colonnes que vous avez sélectionnées sont dans votre table de base et non dans la table jointe externe. Que voulez-vous dire que rien ne fonctionne? Je suppose que les trois requêtes sont toutes des tentatives différentes au même code? – kchason

Répondre

0

génériquement, puisque votre code est plutôt désordonné:

SELECT 
    TblA.column1, 
    TblA.column2, 
    TblB.column3 
FROM 
    a AS TblA 
LEFT JOIN 
    b AS TblB 
    ON TblA.column4 = TblB.column4 

Amènerons à NULL pour column3 où les tables ne rejoignent pas (ou la valeur column3 est NULL) .

Par conséquent, vous pouvez ajouter une instruction IF changer cela:

SELECT 
    TblA.column1, 
    TblA.column2, 
    IF(TblB.column3 IS NULL, 0, TblB.column3) AS column3 
FROM 
    a AS TblA 
LEFT JOIN 
    b AS TblB 
    ON TblA.column4 = TblB.column4 

qui dit que « si colonne3 est nulle, puis réglez à 0, sinon, le retour de la valeur de la colonne. »

0

Vous devez déplacer les critères de filtrage de la table externe de la clause WHERE vers la clause ON de la jointure. Sinon, vous convertissez implicitement en INNER JOIN.

Quelque chose comme cela devrait fonctionner pour vous:

select substr(s.initial_group_code,1,3) as ko_tun, 
    count(g.study_entitlement_id) 
from study_entitlement s 
left outer join graduation_status g on g.study_entitlement_id = s.id 
    and g.graduation_status_date between str_to_date('01.01.2017', '%d.%m.%Y') 
    and str_to_date('31.01.2017', '%d.%m.%Y') 
where substr(s.initial_group_code,1,3) = 'AUT' 
group by substr(s.initial_group_code,1,3); 
+0

Merci à un million d'Ike Walker.J'ai effectivement eu les critères de filtrage au début de la clause ON, mais je n'ai pas remarqué que je comptais la mauvaise colonne. Alors merci encore :) –