带有count的SQL语句问题

时间:2011-06-18 14:34:43

标签: sql

我有一个返回的SQL语句:

AUFTRNR     MITARBNAME      GESAMTDIFFERENZ
  2           Schmidt               5
  2           Schmidt             -20
  2           Schmidt               0
  2           Schmidt              -5
  2           Schmidt               5

但我需要:

AUFTRNR    MITARBNAME      GESAMTDIFFERENZ
   2         Schmidt              -20

这意味着:我需要一些能算上“GESAMTDIFFERENZ”值的东西 (5 + -20 + -5 + 0 + -5 + 5)

我的代码:

select arbeitsauftrag.AUFTRNR, 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

3 个答案:

答案 0 :(得分:1)

只需在SQL中添加GROUP BY MITARBNAME

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

另外,为了避免意外/意外的笛卡尔积,我强烈建议远离旧式的JOIN语法 - 而是使用显式的ANSI样式INNER JOIN表达式(我也开始使用表别名来使事情变得更容易和更易读):

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 

它还使您的WHERE子句更容易阅读!

答案 1 :(得分:1)

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

答案 2 :(得分:1)

这样的东西
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