[PostgreSQL] query totaal aantal orders per maand en jaar

Pagina: 1
Acties:
  • 463 views sinds 30-01-2008

  • Mishmash
  • Registratie: Juli 2002
  • Laatst online: 13-12-2023
Beste mensen,

Ik probeer een query te bouwen waar ik het totaal aantal orders per maand en de omzet per maand van het afgelopen jaar te zien krijg, dus ongeveer:

Januari: 12 orders, 5000 omzet
Februari: 23 orders, 8000 omzet

etc...

Nu heb ik bij elke order een datumveld van het type date, maar ik krijg het niet voor mekaar om die selectie goed te krijgen...

ik heb op dit moment dit:

code:
1
2
3
4
5
select bestelling, SUM(artikel * aantal)
from bestelling_product
where bestelling = (select bestelnummer from bestelling where status = 'afgerond'
                    and leverdatum IN Year(Datum) = 2005)
GROUP by bestelling


Ik probeer dus eerst voor mekaar te krijgen dat ik alle bestellingen met de status 'afgerond' per jaar tevoorschijn kan krijgen, maar dat lukt me zelfs al niet...

[ Voor 5% gewijzigd door Mishmash op 28-12-2005 14:58 ]


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 20-04 08:21

Janoz

Moderator Devschuur®

!litemod

"leverdatum IN Year(Datum) = 2005"??

Wat wil je hier mee bereiken? SQL heeft een bepaalde syntax. Je moet niet gaan proberen spreektaal te matchen met syntax delen, maar begrijpen wat je met bepaalde syntax kunt bereiken?

Je wilt het jaar gelijk hebben aan 2005? Neem dan het jaar van de leverdatum en kijk of dit gelijk is aan 2005.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • Mishmash
  • Registratie: Juli 2002
  • Laatst online: 13-12-2023
Mja, maar leverdatum is opgebouwd als YYYY/MM/DD, hoe zorg ik er dan voor dat hij alleen het jaar pakt?

Verwijderd

code:
1
2
3
4
select bestelling, SUM(artikel * aantal)
from bestelling_product, bestelling
where bestelling =  bestelnummer AND status = 'afgerond' AND YEAR(leverdatum) = 2005
GROUP by bestelling

zoiets? waarom met een subquery?

En het werkt niet, maar krijg je ook een foutmelding?

  • Mishmash
  • Registratie: Juli 2002
  • Laatst online: 13-12-2023
Verwijderd schreef op woensdag 28 december 2005 @ 15:05:
code:
1
2
3
4
select bestelling, SUM(artikel * aantal)
from bestelling_product, bestelling
where bestelling =  bestelnummer AND status = 'afgerond' AND YEAR(leverdatum) = 2005
GROUP by bestelling

zoiets? waarom met een subquery?

En het werkt niet, maar krijg je ook een foutmelding?
Ik krijg deze foutmelding:

ERROR: function year(leverdatum) does not exist
HINT: No function matches the given name and argument types. You may need to add explicit type casts.

Verwijderd

Oke, wist niet dat dit niet werkt in postgresql... Ff googlen en ik kom op deze pagina. Gok dat je iets moet doen met date_part :)

Hmms volgens mij slaat het nergens op, YEAR is volgens mij standaard SQL. Maar goed, dit moet je zelf ook wel kunnen uitzoeken :) Niet in postgresql wss...

Te laat Janoz :+

[ Voor 34% gewijzigd door Verwijderd op 28-12-2005 15:15 ]


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 20-04 08:21

Janoz

Moderator Devschuur®

!litemod

De Year function bestaat dus niet. Misschien een ideetje om eens de manual erbij te pakken?

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • Mishmash
  • Registratie: Juli 2002
  • Laatst online: 13-12-2023
Ik moet denk ik deze gebruiken:

The year field

SELECT EXTRACT(YEAR FROM TIMESTAMP '2001-02-16 20:38:40');
Result: 2001

maar hoe pas ik dat toe op mijn query? :/

edit:

Volgens mij heb ik hem zo goed:
[code]
select bestelling, SUM(artikel * aantal)
from bestelling_product, bestelling
where bestelling = bestelnummer
AND status = 'afgerond'
AND leverdatum IN (select EXTRACT (YEAR FROM leverdatum))
GROUP by bestelling
[/code]

[ Voor 47% gewijzigd door Mishmash op 28-12-2005 15:20 ]


Verwijderd

Sorry, maar moeten we je alles voorkauwen??

code:
1
2
3
4
select bestelling, SUM(artikel * aantal)
from bestelling_product, bestelling
where bestelling =  bestelnummer AND status = 'afgerond' AND DATE_PART('YEAR', leverdatum) = 2005
GROUP by bestelling

Of met jouw extract in de where-clause zou het mijns inziens gewoon moeten werken.

  • Varienaja
  • Registratie: Februari 2001
  • Laatst online: 14-06-2025

Varienaja

Wie dit leest is gek.

Als je nou even kijkt in de help bij 'formatting functions', dan lees je:

code:
1
to_char(current_timestamp, 'HH12:MI:SS')


Dus met ... where to_char(datum,'YYYY')='2005' kan je aan de slag.

edit:
SELECT EXTRACT(YEAR FROM TIMESTAMP '2001-02-16 20:38:40'); werkt ook, maar daarover vind ik niks in de help van postgres.. tsk.. :)

[ Voor 35% gewijzigd door Varienaja op 28-12-2005 15:24 ]

Siditamentis astuentis pactum.


Verwijderd

Voor de performance zou ik het niet met een IN doen 8)7 Dat is niet echt snel namelijk :) Gewoon met een vergelijking, zoals diegene boven mij en ik al aangeven.

En weet je zeker dat die subquery werkt zonder FROM?? Lijkt me stug :)

[ Voor 19% gewijzigd door Verwijderd op 28-12-2005 15:26 ]


  • Mishmash
  • Registratie: Juli 2002
  • Laatst online: 13-12-2023
Die sub query werkt wel ja, dat verbaasde mij ook ;)

Maar nu ga ik het volgende probleem oplossen, ik wil nu nml het jaar 2005 onderverdeeld hebben in maanden en van elke maand het aantal orders weten.

SQL is niet mijn ding... }:O

Verwijderd

Mishmash schreef op woensdag 28 december 2005 @ 15:28:
Die sub query werkt wel ja, dat verbaasde mij ook ;)
Toch zou ik het anders doen als ik jou was... Dit is niet echt heel erg mooi of zo.
Mishmash schreef op woensdag 28 december 2005 @ 15:28:
Maar nu ga ik het volgende probleem oplossen, ik wil nu nml het jaar 2005 onderverdeeld hebben in maanden en van elke maand het aantal orders weten.

SQL is niet mijn ding... }:O
Give it a try, probeer het eerst zelf eens :) Als wij het voor je voorkauwen, leer je er ook niets van.

[ Voor 45% gewijzigd door Verwijderd op 28-12-2005 15:30 ]


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 20-04 08:21

Janoz

Moderator Devschuur®

!litemod

@MisMatch: leverdatum IN (select EXTRACT (YEAR FROM leverdatum))

Wat denk je dat dit doet? Probeer nu eens te omschrijven waar je nu daadwerkelijk mee bezig bent ipv maar wat simpel dingetjes heen en weer kopieren. Wat je daar hebt staan is een enorm inefficiente manier om de resultaten van alle jaren terug te krijgen, maar dat had je natuurlijk zelf ook wel kunnen bedenken aangezien je nergens meer 2005 in je query hebt staan.

@varienaja: IMHO is de EXTRACT methode netter om het jaar uit een datum te krijgen. En in het linkje dat ik eerder gepost hebt kun je extract vast wel vinden ;)..

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • Mishmash
  • Registratie: Juli 2002
  • Laatst online: 13-12-2023
Verwijderd schreef op woensdag 28 december 2005 @ 15:29:
[...]

Toch zou ik het anders doen als ik jou was... Dit is niet echt heel erg mooi of zo.
Ik ga ook jouw query gebruiken...

  • Mishmash
  • Registratie: Juli 2002
  • Laatst online: 13-12-2023
Ik heb besloten om eerst de orders van 1 maand allemaal uit te gaan rekenen, alleen nu loop ik weer tegen een probleem aan..

code:
1
2
3
4
5
select a.artikel,prijs, bestelling, aantal, sum(aantal*prijs)
from artikel_prijs a, bestelling_product b
where a.artikel = b.artikel
and bestelling = 14
GROUP by bestelling, a.artikel, aantal,a.prijs


Dat zorgt voor deze uitkomst:
code:
1
2
3;$4.00;14;20;$80.00
4;$0.00;14;3;$0.00


Nu wil ik dus dat de 2 dollar waardes meteen bij elkaar opgeteld worden. in java zou ik dat doen met een array en vervolgens gaan tellen, maar is het ook mogelijk om dat direct door sql te laten doen?

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 20-04 08:21

Janoz

Moderator Devschuur®

!litemod

Bij welk record zou dat totaal dan moeten horen?

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • Mishmash
  • Registratie: Juli 2002
  • Laatst online: 13-12-2023
Ik moet een totaalprijs genereren, in de tabel artikelen staat het artikelnummer en de prijs, in de tabel bestelling_product staan de artikelnummers en de aantallen. Die totaalprijs hoeft verder niet in de database opgeslagen te worden, deze wil ik alleen gebruiken binnen het programma

Verwijderd

Met een subquery...

code:
1
2
3
4
5
6
7
SELECT sum(regel_prijs) FROM (
select a.artikel,prijs, bestelling, aantal, sum(aantal*prijs) AS regel_prijs
from artikel_prijs a, bestelling_product b
where a.artikel = b.artikel
and bestelling = 14
GROUP by bestelling, a.artikel, aantal,a.prijs
)

  • Mishmash
  • Registratie: Juli 2002
  • Laatst online: 13-12-2023
ERROR: subquery in FROM must have an alias
HINT: For example, FROM (SELECT ...) [AS] foo.

Sorry, ik ben niet zo thuis in SQL queries, wat moet ik hiermee aan?

**edit**
Ok heb hem al, er moest nog een AS regel_prijs onder

[ Voor 17% gewijzigd door Mishmash op 30-12-2005 17:45 ]


Verwijderd

Mishmash schreef op vrijdag 30 december 2005 @ 17:37:
ERROR: subquery in FROM must have an alias
HINT: For example, FROM (SELECT ...) [AS] foo.

Sorry, ik ben niet zo thuis in SQL queries, wat moet ik hiermee aan?
Een boek kopen? Ondertussen is de hele query je al voorgekauwd.

  • Mishmash
  • Registratie: Juli 2002
  • Laatst online: 13-12-2023
Ik heb er ook een boek van, ik heb er ook les in gehad. Maar ik haat het... Ik wil liever netwerken etc. doen, maar dit moet nou eenmaal voor school...

  • Mishmash
  • Registratie: Juli 2002
  • Laatst online: 13-12-2023
OK, ik ben er bijna :D

code:
1
2
3
4
5
6
7
8
9
SELECT sum(regel_prijs) FROM (
select a.artikel,prijs, bestelling, aantal, sum(aantal*prijs) AS regel_prijs
from artikel_prijs a, bestelling_product b,bestelling
where a.artikel = b.artikel
AND DATE_PART('MONTH', leverdatum) = 11
and DATE_PART('YEAR', leverdatum) = 2005
GROUP by bestelling, a.artikel, aantal,a.prijs
)
AS regel_prijs

Dit zorgt voor de totale opbrengst van maand 11 van het jaar 2005

Is het mogelijk om elke maand van het jaar 2005 het te laten zien? Of moet ik in java een teller laten lopen die de maand telkens met 1 ophoogt?

[ Voor 3% gewijzigd door Mishmash op 30-12-2005 18:09 ]


Verwijderd

Moeten we alles voor jou doen??? Haal die WHERE clause van Month weg en group by month. Of zoiets, maar dat mag je zelf bedenken.

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 20-04 08:21

Janoz

Moderator Devschuur®

!litemod

Zie Boland & Jan Klaasen. In Programming & Webscripting verwachten we ook dat je zelf wat doet. Het is niet de bedoeling dat alles compleet voorgekauwd wordt.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'

Pagina: 1

Dit topic is gesloten.