开发者

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
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜