SQL statement problem with count
I have a SQL statement which returns:
AUFTRNR MITARBNAME GESAMTDIFFERENZ
2 Schmidt 5
2 Schmidt -20
2 Schmidt 0
2 Schmidt -5
2 Schmidt 5
but I need:
AUFTRNR MITARBNAME GESAMTDIFFERENZ
2 Schmidt -20
that mean: I need something that count me the values from the "GESAMTDIFFERENZ" (5 + -20 + -5 + 0 + -5 + 5)
My Code:
select arbeitsauftrag.AUFTR开发者_Go百科NR, mitarbeiter.MITARBNAME, (arbeitszeit.ISTZEIT-arbeitsgang.SOLLZEIT) Gesamtdifferenz from ARBEITSAUFTRAG,MITARBEITER,ARBEITSGANG,ARBEITSZEIT where
arbeitsauftrag.FERTIGDATUM IS NOT NULL and arbeitsauftrag.MITARBNR=mitarbeiter.MITARBNR
and ARBEITSGANG.TEILNR=ARBEITSAUFTRAG.TEILNR
and ARBEITSGANG.AGNR=ARBEITSZEIT.AGNR
and ARBEITSZEIT.AUFTRNR=ARBEITSAUFTRAG.AUFTRNR
Something like
select arbeitsauftrag.AUFTRNR, mitarbeiter.MITARBNAME, sum(arbeitszeit.ISTZEIT-arbeitsgang.SOLLZEIT) Gesamtdifferenz from ARBEITSAUFTRAG,MITARBEITER,ARBEITSGANG,ARBEITSZEIT where
arbeitsauftrag.FERTIGDATUM IS NOT NULL and arbeitsauftrag.MITARBNR=mitarbeiter.MITARBNR
and ARBEITSGANG.TEILNR=ARBEITSAUFTRAG.TEILNR
and ARBEITSGANG.AGNR=ARBEITSZEIT.AGNR
and ARBEITSZEIT.AUFTRNR=ARBEITSAUFTRAG.AUFTRNR
group by arbeitsauftrag.AUFTRNR, mitarbeiter.MITARBNAME
?
Just simply add a GROUP BY MITARBNAME
to your SQL:
select
arbeitsauftrag.AUFTRNR, mitarbeiter.MITARBNAME,
SUM(arbeitszeit.ISTZEIT-arbeitsgang.SOLLZEIT) Gesamtdifferenz
from ARBEITSAUFTRAG, MITARBEITER, ARBEITSGANG, ARBEITSZEIT
where
arbeitsauftrag.FERTIGDATUM IS NOT NULL
and arbeitsauftrag.MITARBNR=mitarbeiter.MITARBNR
and ARBEITSGANG.TEILNR=ARBEITSAUFTRAG.TEILNR
and ARBEITSGANG.AGNR=ARBEITSZEIT.AGNR
and ARBEITSZEIT.AUFTRNR=ARBEITSAUFTRAG.AUFTRNR
GROUP BY
mitarbeiter.MITARBNAME
Also, to avoid unwanted / unexpected cartesian products, I would strongly recommend to get away from the old-style JOIN syntax that you have - instead use explicit ANSI-style INNER JOIN
expressions (and I'd also start using table aliases to make things easier and more readable):
FROM
ARBEITSAUFTRAG aa
INNER JOIN
MITARBEITER m ON aa.MITARBNR = m.MITARBNR
INNER JOIN
ARBEITSGANG ag ON ag.TEILNR = aa.TEILNR
INNER JOIN
ARBEITSZEIT az ON ag.AGNR = az.AGNR
AND az.AUFTRNR = aa.AUFTRNR
where
arbeitsauftrag.FERTIGDATUM IS NOT NULL
It also makes your WHERE clause much easier to read!
select arbeitsauftrag.AUFTRNR, mitarbeiter.MITARBNAME, SUM(arbeitszeit.ISTZEIT-arbeitsgang.SOLLZEIT) Gesamtdifferenz
from ARBEITSAUFTRAG,MITARBEITER,ARBEITSGANG,ARBEITSZEIT
where
arbeitsauftrag.FERTIGDATUM IS NOT NULL and arbeitsauftrag.MITARBNR=mitarbeiter.MITARBNR
and ARBEITSGANG.TEILNR=ARBEITSAUFTRAG.TEILNR
and ARBEITSGANG.AGNR=ARBEITSZEIT.AGNR
and ARBEITSZEIT.AUFTRNR=ARBEITSAUFTRAG.AUFTRNR
GROUP BY arbeitsauftrag.AUFTRNR, mitarbeiter.MITARBNAME
精彩评论