/ Forside / Teknologi / Udvikling / SQL / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
SQL
#NavnPoint
pmbruun 1704
niller 962
fehaar 730
Interkril.. 701
ellebye 510
pawel 510
rpje 405
pete 350
gibson 320
10  smorch 260
Problemer med sum og group by
Fra : Ryan Kristensen


Dato : 05-09-08 14:30

Hej.

Jeg har et problem med en sql-forespørgsel i en mysql-database.
Jeg har tre databaser: en med produkter, en med tilbehør til produkterne,
og en database jeg bruger til at tilknytte tilbehøret til produkterne.
PRODUKTER
produkter_id PK
navn
tillæg

TILBEHØR
tilbehør_id PK
navn
pris

TILBEHØR_I_PRODUKTER
produkter_id
tilbehør_id

Jeg vil gerne sortere efter den samlede pris, som skal være summen af
prisen på alt tilknyttet tilbehør, og i nogle tilfælde skal et tillægsfelt
i produkter tilføjes til summen. Problemet er, at når jeg bruger
nedenstående sql-forespørgsel, så bliver tillægget tilføjet for hver
enkelt tilbehør, og jeg ville gerne have, at det kun blev tilføjet én gang
pr. produkt, uanset hvor meget tilbehør der måtte være. Der vil derudover
også være nogle tilfælde, hvor et produkt ikke indeholder noget tilbehør,
i det tilfælde skal den samlede pris selvfølgelig bare være indholdet af
tillægs-feltet.

Er det muligt?

SELECT p.navn, p.tillæg, SUM(t.pris+p.tillæg), t.pris
FROM produkter p
LEFT JOIN tilbehør_i_produkter tp
ON p.produkter_id=tp.produkter_id
LEFT JOIN tilbehør t
ON tp.tilbehør_id=t.tilbehør_id
GROUP BY p.produkter_id
ORDER BY SUM(t.pris+p.tillæg)

--
Mvh.
Ryan Kristensen

 
 
Kaj Julius (05-09-2008)
Kommentar
Fra : Kaj Julius


Dato : 05-09-08 21:56


"Ryan Kristensen" <usenet@ryankristensen.invalid> skrev i en meddelelse
news.ug0fsthyzr1c02@ryan-ts6hqrwscb...
> Hej.
>
> Jeg har et problem med en sql-forespørgsel i en mysql-database.
> Jeg har tre databaser: en med produkter, en med tilbehør til produkterne,
> og en database jeg bruger til at tilknytte tilbehøret til produkterne.
> PRODUKTER
> produkter_id PK
> navn
> tillæg
>
> TILBEHØR
> tilbehør_id PK
> navn
> pris
>
> TILBEHØR_I_PRODUKTER
> produkter_id
> tilbehør_id
>
> Jeg vil gerne sortere efter den samlede pris, som skal være summen af
> prisen på alt tilknyttet tilbehør, og i nogle tilfælde skal et tillægsfelt
> i produkter tilføjes til summen. Problemet er, at når jeg bruger
> nedenstående sql-forespørgsel, så bliver tillægget tilføjet for hver
> enkelt tilbehør, og jeg ville gerne have, at det kun blev tilføjet én gang
> pr. produkt, uanset hvor meget tilbehør der måtte være. Der vil derudover
> også være nogle tilfælde, hvor et produkt ikke indeholder noget tilbehør,
> i det tilfælde skal den samlede pris selvfølgelig bare være indholdet af
> tillægs-feltet.
>
> Er det muligt?
>
> SELECT p.navn, p.tillæg, SUM(t.pris+p.tillæg), t.pris
> FROM produkter p
> LEFT JOIN tilbehør_i_produkter tp
> ON p.produkter_id=tp.produkter_id
> LEFT JOIN tilbehør t
> ON tp.tilbehør_id=t.tilbehør_id
> GROUP BY p.produkter_id
> ORDER BY SUM(t.pris+p.tillæg)
>
> --
> Mvh.
> Ryan Kristensen


Prøv med:

SELECT p.navn, p.tillæg, SUM(t.pris)+p.tillæg as slutpris
FROM produkter p
LEFT JOIN tilbehør_i_produkter tp
ON p.produkter_id=tp.produkter_id
LEFT JOIN tilbehør t
ON tp.tilbehør_id=t.tilbehør_id
GROUP BY p.produkter_id
ORDER BY slutpris

Alternativt, prøv med en inline forespørgsel:

SELECT navn, tillæg, totpris + tillæg as slutpris
FROM (
SELECT p.navn, p.tillæg, SUM(t.pris) as totpris
FROM produkter p
LEFT JOIN tilbehør t
ON tp.tilbehør_id=t.tilbehør_id
LEFT JOIN tilbehør_i_produkter tp
ON p.produkter_id=tp.produkter_id
GROUP BY p.produkter_id
) AS x
ORDER BY totpris + tillæg




Ryan Kristensen (07-09-2008)
Kommentar
Fra : Ryan Kristensen


Dato : 07-09-08 10:23

On Fri, 05 Sep 2008 22:55:53 +0200, Kaj Julius <jj.x@ldp.com.dk> wrote:

> Prøv med:
>
> SELECT p.navn, p.tillæg, SUM(t.pris)+p.tillæg as slutpris
> FROM produkter p
> LEFT JOIN tilbehør_i_produkter tp
> ON p.produkter_id=tp.produkter_id
> LEFT JOIN tilbehør t
> ON tp.tilbehør_id=t.tilbehør_id
> GROUP BY p.produkter_id
> ORDER BY slutpris
>
> Alternativt, prøv med en inline forespørgsel:
>
> SELECT navn, tillæg, totpris + tillæg as slutpris
> FROM (
> SELECT p.navn, p.tillæg, SUM(t.pris) as totpris
> FROM produkter p
> LEFT JOIN tilbehør t
> ON tp.tilbehør_id=t.tilbehør_id
> LEFT JOIN tilbehør_i_produkter tp
> ON p.produkter_id=tp.produkter_id
> GROUP BY p.produkter_id
> ) AS x
> ORDER BY totpris + tillæg

Begge dele giver det samme resultat, tillægget bliver kun tilføjet, hvis
der er noget tilbehør. Hvis produktet ikke har noget tilbehør tilknyttet,
får jeg ikke noget output på prisen, og derfor bliver det placeret før
produkter med en samlet pris på 1.
Er der en mulighed for at få prisen = tillæg, hvis antallet af tilbehør er
0? Eller skal jeg tilføje et dummy tilbehør med en pris på 0 til alle
produkter?

--
Mvh.
Ryan Kristensen

Kaj Julius (08-09-2008)
Kommentar
Fra : Kaj Julius


Dato : 08-09-08 21:29


"Ryan Kristensen" <usenet@ryankristensen.invalid> skrev i en meddelelse
news.ug3tjxpuzr1c02@ryan-ts6hqrwscb...
> On Fri, 05 Sep 2008 22:55:53 +0200, Kaj Julius <jj.x@ldp.com.dk> wrote:
>
>> Prøv med:
>>
>> SELECT p.navn, p.tillæg, SUM(t.pris)+p.tillæg as slutpris
>> FROM produkter p
>> LEFT JOIN tilbehør_i_produkter tp
>> ON p.produkter_id=tp.produkter_id
>> LEFT JOIN tilbehør t
>> ON tp.tilbehør_id=t.tilbehør_id
>> GROUP BY p.produkter_id
>> ORDER BY slutpris
>>
>> Alternativt, prøv med en inline forespørgsel:
>>
>> SELECT navn, tillæg, totpris + tillæg as slutpris
>> FROM (
>> SELECT p.navn, p.tillæg, SUM(t.pris) as totpris
>> FROM produkter p
>> LEFT JOIN tilbehør t
>> ON tp.tilbehør_id=t.tilbehør_id
>> LEFT JOIN tilbehør_i_produkter tp
>> ON p.produkter_id=tp.produkter_id
>> GROUP BY p.produkter_id
>> ) AS x
>> ORDER BY totpris + tillæg
>
> Begge dele giver det samme resultat, tillægget bliver kun tilføjet, hvis
> der er noget tilbehør. Hvis produktet ikke har noget tilbehør tilknyttet,
> får jeg ikke noget output på prisen, og derfor bliver det placeret før
> produkter med en samlet pris på 1.
> Er der en mulighed for at få prisen = tillæg, hvis antallet af tilbehør er
> 0? Eller skal jeg tilføje et dummy tilbehør med en pris på 0 til alle
> produkter?
>
> --
> Mvh.
> Ryan Kristensen

Ok, det er sikkert fordi SUM(t.pris) vil returnere null, når der ikke er
noget tilbehør. Null + tillæg resulterer så åbenbart i null.
Prøv at ændre det til SUM(COALESCE(t.pris, 0)) - det burde klare det
problem.



Ryan Kristensen (18-09-2008)
Kommentar
Fra : Ryan Kristensen


Dato : 18-09-08 15:48

On Mon, 08 Sep 2008 22:29:23 +0200, Kaj Julius <jj.x@ldp.com.dk> wrote:

> Ok, det er sikkert fordi SUM(t.pris) vil returnere null, når der ikke er
> noget tilbehør. Null + tillæg resulterer så åbenbart i null.
> Prøv at ændre det til SUM(COALESCE(t.pris, 0)) - det burde klare det
> problem.

Puha det tog mig lige lidt tid at få gang i computeren, efter jeg endnu en
gang gav mig i kast med at åbne ukendte vedhæftede exe-filer. Så ofte som
jeg gør det, skulle man næsten tro, det var en hobby.

Mange tak for hjælpen, det virker præcis som det skal.
Endnu en funktion jeg ikke kendte. Jeg må hellere snart få mig arbejdet
igennem den manual, da der hele tiden dukker nye interessante muligheder
op.

--
Mvh.
Ryan Kristensen

Søg
Reklame
Statistik
Spørgsmål : 177428
Tips : 31962
Nyheder : 719565
Indlæg : 6407944
Brugere : 218877

Månedens bedste
Årets bedste
Sidste års bedste