[(my)sql 4x] subquery

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

  • oogapp0ltje
  • Registratie: Januari 2001
  • Niet online
Momenteel werk ik aan een rapportgenerator voor een klein bedrijfje, deze wil in een oogopslag de jaarverkoopcijfers kunnen zien en de cijfers van het jaar daarvoor (als vergelijkingsmateriaal). Nu denk ik zelf dat dat moet kunnen in de query zelf aangezien mysql vanaf versie 4 subqueries ondersteund. Ik snap alleen niet hoe het mogelijk is om een subquery te gebruiken in deze situatie.

De query die ik heb voor de jaarcijfers:
code:
1
2
3
4
5
6
SELECT DISTINCT(jaar) as 'Jaar',
sum(Verkopen) as 'Afzet', 
sum(Kostprijs) as 'Totale kosten', 
sum(Verkoopprijs) as 'Omzet', 
sum(Verkoopprijs)-sum(Kostprijs) as 'Bruto winst' 
FROM statbasedag WHERE verkopen > 0 GROUP BY jaar


Mijn instinct zegt me dat de query zoiets zou moeten worden:
code:
1
2
3
4
5
6
7
8
9
SELECT DISTINCT(jaar) as 'Jaar',
sum(Verkopen) as 'Afzet', 
sum(Kostprijs) as 'Totale kosten', 
sum(Verkoopprijs) as 'Omzet', 
sum(Verkoopprijs)-sum(Kostprijs) as 'Bruto winst', 
(SELECT sum(t1.Verkoopprijs)-sum(t1.Kostprijs) FROM statbasedag as t1 
WHERE t1.jaar = jaar-1) as 'Bruto winst vorig jaar'

FROM statbasedag WHERE verkopen > 0 GROUP BY jaar
Een query als deze werkt niet, misschien nog wel logisch ook :). Toch kan ik hierover nix vinden in de mysqldocs, GoT, of google... Ik vraag mij af, is dit uberhoubt wel mogelijk in mysql?

| To acknowledge what is known as known and what is not known as known is knowledge. |


  • flashin
  • Registratie: Augustus 2002
  • Laatst online: 17-12-2023
Subquery's werken zo helaas niet (http://dev.mysql.com/doc/mysql/en/Subqueries.html)

Volgens mij kun je die eerste query ook gewoon gebruiken want die selecteert toch alle jaren :S? Als je het ff ORDER BY jaar DESC en dan LIMIT 2 doet heb je toch het jaar wat er nu is en het vorige jaar? Of begrijp ik de opzet van je database niet

edit: woeps je kunt subquery's wel in je select gooien (http://dev.mysql.com/doc/mysql/en/Scalar_subqueries.html)

edit2: LIMIT kan ook handig zijn voor die subquery, jaar-1 werkt natuurlijk niet. Ik weet uberhaupt niet of je die aliassen van de eerste select daarin kunt gebruiken, in dat geval moet je Jaar ff anders noemen.

SELECT sum(t1.Verkoopprijs)-sum(t1.Kostprijs) FROM statbasedag as t1 LIMIT 1,1
en dan krijg je vorig jaar

[ Voor 54% gewijzigd door flashin op 30-11-2004 23:13 ]


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 21:24

NMe

Quia Ego Sic Dico.

Vanaf versie 4.1 ondersteunt MySQL pas subqueries, en dat staat wel degelijk in de documentatie, en bovendien ook op GoT.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Verwijderd

Hier heb je toch geen subqueries voor nodig?

code:
1
2
3
4
5
6
7
8
9
10
SELECT DISTINCT(J1.jaar) as 'Jaar',
sum(J1.Verkopen) as 'Afzet', 
sum(J1.Kostprijs) as 'Totale kosten', 
sum(J1.Verkoopprijs) as 'Omzet', 
sum(J1.Verkoopprijs)-sum(J1.Kostprijs) as 'Bruto winst',
sum(J2.Verkoopprijs)-sum(J2.Kostprijs) as 'Bruto winst vorig jaar'
FROM statbasedag J1, statbasedag J2
WHERE verkopen > 0 
 AND J2.Jaar=J1.Jaar-1
GROUP BY J1.jaar


Zoiets zou toch ook moeten werken?

  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

Verwijderd schreef op woensdag 01 december 2004 @ 00:48:
Hier heb je toch geen subqueries voor nodig?

code:
1
2
3
4
5
6
7
8
9
10
SELECT DISTINCT(J1.jaar) as 'Jaar',
sum(J1.Verkopen) as 'Afzet', 
sum(J1.Kostprijs) as 'Totale kosten', 
sum(J1.Verkoopprijs) as 'Omzet', 
sum(J1.Verkoopprijs)-sum(J1.Kostprijs) as 'Bruto winst',
sum(J2.Verkoopprijs)-sum(J2.Kostprijs) as 'Bruto winst vorig jaar'
FROM statbasedag J1, statbasedag J2
WHERE verkopen > 0 
 AND J2.Jaar=J1.Jaar-1
GROUP BY J1.jaar


Zoiets zou toch ook moeten werken?
Dit gaat niet werken omdat je meerdere records per jaar hebt, door op jaar te joinen bouw je een carthetisch produkt tussen alle records van jaar en jaar-1.

Wellicht kun je dit oplossen met een select binnen de select list.
Ik weet niet zeker of mysql dat ondersteunt.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
SELECT J1.jaar as 'Jaar',
sum(J1.Verkopen) as 'Afzet', 
sum(J1.Kostprijs) as 'Totale kosten', 
sum(J1.Verkoopprijs) as 'Omzet', 
sum(J1.Verkoopprijs)-sum(J1.Kostprijs) as 'Bruto winst',
( SELECT sum(J2.Verkoopprijs)-sum(J2.Kostprijs) 
  FROM statbasedag J2
  WHERE J2.verkopen > 0 
  AND J2.jaar = J1.jaar
  GROUP BY J2.jaar
) as 'Bruto winst vorig jaar'
FROM statbasedag J1
WHERE J1.verkopen > 0 
GROUP BY J1.jaar

Who is John Galt?


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 20:44

Creepy

Tactical Espionage Splatterer

Ravenof schreef op dinsdag 30 november 2004 @ 22:40:
Een query als deze werkt niet, misschien nog wel logisch ook :). Toch kan ik hierover nix vinden in de mysqldocs, GoT, of google... Ik vraag mij af, is dit uberhoubt wel mogelijk in mysql?
Zie het commentaar van NME. Ik betwijfel echt of je wel daadwerkelijk hebt gezocht. Dat MySQL 3.x en 4.0 geen subqueries ondersteunen is toch vrij algemeen bekend. En we hebben het zelf in de P&W faq opgenomen :) P&W FAQ - MySQL
Edit: foutje in de FAQ zie ik. Nu lijkt het alsof 4.0 wel sub query ondersteuning heeft....


Daarnaast kunnen we met een opmerking als "het werkt niet" vrij weinig. Het zou handig zijn als je zou kunnen aangeven wat je al geprobeerd hebt, wat er niet werkt en of je een foutmelding krijgt (en zo ja, welke). Zie ook: P&W FAQ - De "quickstart"


Kijk ook even naar de queries van Jan Klaasen en justmental, misschien dat je daar wat mee kan (note: ook justmental gebruikt een subquery).

[ Voor 27% gewijzigd door Creepy op 01-12-2004 09:14 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney

Pagina: 1

Dit topic is gesloten.