Avatar billede michael_stim Ekspert
09. august 2005 - 09:47 Der er 6 kommentarer og
3 løsninger

Få MAX af SUM

Hvordan får jeg MAX() ud af en SUM()?

$tmpressql="SELECT SUM(e.antal) AS mest, k.vare_tekst AS vare FROM kmpv_kmpkamp k, kundeordrer e WHERE k.levnr='" . $levnr . "' AND k.varenr=e.varenr AND k.ugenr='" . $uge . "' AND mest=(SELECT MAX(mest) FROM kundeordrer)";

Det er kolonnen antal der først skal summeres og derefter skal MAX findes.

Prøvede med en anden forespørgsel hvor det virkede, men der kunne jeg KUN få MAX ud, og ingen anden data.
Avatar billede michael_stim Ekspert
09. august 2005 - 09:54 #1
Den her fungerer, men der bliver jo kun "mest" udskrevet.
SELECT MAX(antal) AS mest FROM(SELECT SUM(e.antal) AS antal FROM kmpv_kmpkamp k, kundeordrer e WHERE k.levnr='106294' AND k.varenr=e.varenr AND k.ugenr='34' GROUP BY e.varenr)
Avatar billede hgc Nybegynder
09. august 2005 - 10:17 #2
Hvad vil du have mere end "mest" ?
Du kan evt bruge en syntax a al

select * from (
  select * from (
    select varenr, sum(antal) antal from tabel
    group by varenr)
  order by antal desc)
where rownum = 1
Avatar billede michael_stim Ekspert
09. august 2005 - 10:26 #3
Hvordan er det performa-mæssigt? Der er ret så meget data i tabellerne.
Avatar billede hgc Nybegynder
09. august 2005 - 10:30 #4
Det afhængig jo meget af om du har en where-betingelse på det inderste inline-view som via index afgrænser til en relativ lille datamængde
Avatar billede michael_stim Ekspert
09. august 2005 - 10:36 #5
Jaja, det er jeg tvunget til at have. Ellers kan den slet ikke få hul ;o)

Hvorfor skal man have alt med når man grupperer???Det er ikke nok at gruppere på kun den kolonne man behøver.

$tmpressql="SELECT * FROM(SELECT SUM(e.antal) AS mest, k.vare_tekst FROM kmpv_kmpkamp k, kundeordrer e WHERE k.levnr='" . $levnr . "' AND k.varenr=e.varenr AND k.ugenr='" . $uge . "' GROUP BY e.varenr, k.vare_tekst ORDER BY mest DESC) WHERE rownum=1";
Avatar billede hgc Nybegynder
09. august 2005 - 10:44 #6
Det ser ud til at du kan spare den ene select * from ...,
men du skal have e.varenr med

SELECT SUM(e.antal) AS mest, k.vare_tekst, e.varenr

når den er med i group by.
Avatar billede michael_stim Ekspert
09. august 2005 - 10:51 #7
Nej den gik ikke. Så skriver den bare et 1-tal hver gang (på summen). Den første fungerede, men hvorfor kan man ikke bare GROUP BY e.antal. Hvorfor skal k.vare_tekst også grupperes?

Den der ikke fungerede:

$tmpressql="SELECT SUM(e.antal) AS mest, k.vare_tekst, e.varenr FROM kmpv_kmpkamp k, kundeordrer e WHERE k.levnr='" . $levnr . "' AND k.varenr=e.varenr AND k.ugenr='" . $uge . "' AND rownum=1 GROUP BY e.varenr, k.vare_tekst ORDER BY mest DESC";
Avatar billede hgc Nybegynder
09. august 2005 - 11:01 #8
Jeg ved ikke hvorfor du har varetekst med i din group by, men syntaxen der skal overholdes er

select a, b, sum(antal) from tabel
group by a, b

du skal have a og b med både i select ... og group by ...

Du kan ikke sætte "rownum = 1" ind før group by og order by, for så læses du kun een række for din join. Det du ønsker er at læse een rækker efter group og order og derfor skal placeres i den yderste select som i mit første svar
Avatar billede michael_stim Ekspert
09. august 2005 - 11:16 #9
Ja, og det fungerer. Tak for hjælpen. Men forstår stadig ikke hvorfor Oracle vil have alle de kolonner man vælger, med i grupperingen ;o)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester