2017-12-15 6 views
0

So entfernen Sie Duplikate, wenn in zwei Tabellen dieselben Abteilungsnamen, aber unterschiedliche Werte vorhanden sind. Wenn es gleiche Abteilungen ist, Programm sollte nicht Abteilung nehmen mit 0So entfernen Sie Duplikate mit unterschiedlichen Zählwerten

select distinct d.fullname,count(h.isn) 
from subdept d 

left join subhuman h on h.deptisn=d.isn 
left join subject j on h.isn=j.isn 
left join emilitary em on em.emplisn=j.isn 
where h.sex = 'М' and em.milsign='Y' 
group by rollup (d.fullname) 

union 

select d.fullname, 0 from subdept d 

aktuellem Ergebnis ist in:

in this screenshot

erwartetes Ergebnis ist:

expected result

+0

"untermenschlich" lol! – ADyson

+0

Die meisten Leute wollen hier formatierten Text, keine Bilder. – jarlh

+0

danke für Kommentare Majestäten! Ich werde in Betracht ziehen –

Antwort

0

Try dies

select d.fullname,count(distinct h.isn) 
from subdept d 

left join subhuman h on h.deptisn=d.isn 
left join subject j on h.isn=j.isn 
left join emilitary em on em.emplisn=j.isn 
where h.sex = 'М' and em.milsign='Y' 
group by rollup (d.fullname) 

union 

select d.fullname, 0 from subdept d 
+0

danke, aber es tut nicht ((( –

0

Ich vermute, dass Sie nur die Bedingung auf em.milsign in die on Klausel verschieben möchten. Dieser Zustand dreht die äußere Verknüpfung zu einer inneren Verknüpfung:

select d.fullname, count(h.isn) 
from subdept d left join 
    subhuman h 
    on h.deptisn = d.isn left join 
    subject j 
    on h.isn = j.isn left join 
    emilitary em 
    on em.emplisn = j.isn and em.milsign = 'Y' 
where h.sex = 'М' 
group by rollup (d.fullname); 

Hinweis: select distinct ist so gut wie nie mit group by benötigt.

+0

danke für ratschläge, aber es funktioniert noch nicht ... –

0

meisten definitly Sie in einer eleganteren maner dies tun könnte, aber atleast funktioniert es:

select d.fullname,count(h.isn) 
from subdept d 
left join subhuman h on h.deptisn=d.isn 
left join subject j on h.isn=j.isn 
left join emilitary em on em.emplisn=j.isn 
where h.sex = 'М' and em.milsign='Y' 
group by rollup (d.fullname) 
having count(h.isn)>0 
union 
select g.fullname, 0 from 
subdept g 
where d.fullname not in(
    select tt1.fullname from (
     select d.fullname,count(h.isn) 
     from subdept d 
     left join subhuman h on h.deptisn=d.isn 
     left join subject j on h.isn=j.isn 
     left join emilitary em on em.emplisn=j.isn 
    where h.sex = 'М' and em.milsign='Y' 
    group by rollup (d.fullname) 
    having count(h.isn)>0) tt1 
) 
+0

danke) es funktioniert –

+0

@ user7846849 wie wäre es mit einem upvote? :) – user3532232

+0

sorry ich habe nicht genug Ruf (( –

1

versuchen diese

select d.fullname, ISNULL(dd.c,0) from subdept d 
LEFT JOIN 
(
    select distinct d.fullname,count(h.isn) c 
    from subdept d 

    left join subhuman h on h.deptisn=d.isn 
    left join subject j on h.isn=j.isn 
    left join emilitary em on em.emplisn=j.isn 
    where h.sex = 'М' and em.milsign='Y' 
    group by rollup (d.fullname) 
) dd 
ON d.fullname=dd.fullname 
0

where h.sex='m' and and em.milsign='Y' eine „implizite innere Verknüpfung“ verursacht, dass einige Abteilungen verstecken wenn in den linken verbundenen Tabellen keine übereinstimmenden Zeilen vorhanden sind. Ändern Sie beide Bedingungen beitreten statt:

 
SELECT 
     d.fullname 
    , COUNT(h.isn) 
FROM subdept d 
LEFT JOIN subhuman h ON d.isn = h.deptisn AND h.sex = 'М' 
LEFT JOIN subject j ON h.isn = j.isn 
LEFT JOIN emilitary em ON j.isn = em.emplisn AND em.milsign = 'Y' 
GROUP BY ROLLUP 
     d.fullname 
; 

oder, können Sie die where-Klausel ändern könnte NULLs erlauben durch die Join-Bedingungen neu abgestimmt werden:

 
SELECT 
     d.fullname 
    , COUNT(h.isn) 
FROM subdept d 
LEFT JOIN subhuman h ON d.isn = h.deptisn 
LEFT JOIN subject j ON h.isn = j.isn 
LEFT JOIN emilitary em ON j.isn = em.emplisn 
WHERE (h.sex = 'М' OR h.sex IS NULL) 
AND (em.milsign = 'Y' OR em.milsign IS NULL) 
GROUP BY ROLLUP 
     d.fullname 
; 

Oder wenden Sie die gewünschte Filterung innerhalb einer Unterabfrage:

SELECT 
     d.fullname 
    , COUNT(h.isn) 
FROM subdept d 
LEFT JOIN (
     SELECT 
      h.isn 
      , h.deptisn 
     FROM subhuman h 
     LEFT JOIN subject j ON h.isn = j.isn 
     LEFT JOIN emilitary em ON j.isn = em.emplisn 
     WHERE h.sex = 'М' 
     AND em.milsign = 'Y' 
) h ON d.isn = h.deptisn 
GROUP BY ROLLUP 
     d.fullname 
; 
+0

vielen Dank, es funktioniert) –

Verwandte Themen