Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[SQL] Subquery resultaat uit dezelfde tabel

Pagina: 1
Acties:
  • 788 views sinds 30-01-2008
  • Reageer

  • Urk
  • Registratie: Maart 2000
  • Laatst online: 25-11 03:50
Ik weet niet precies hoe ik dit moet verwoorden maar ik probeer iets (in mijn ogen) simpels te doen, helaas lukt dat niet.

Heel simpelgezegd komt het neer op 1 tabel met omzet informatie van winkels. Deze tabel bevat (uitgekleed) een winkel_id, segment_id, omzet bedrag en maand + jaar.

Nu wil ik in 1 query per winkel EN segment de omzet van bijv. juni 2007 vergelijken met juni 2006. Als output moet deze informatie naast elkaar komen in 2 kolommen samen met de maand+jaar (datum), winkel_id en segment_id.
Deze informatie komt dus uit 1 tabel.

Ik heb het als volgt geprobeerd:
SQL:
1
2
3
4
5
6
SELECT omzet_bedrag, omzet_jaarmaand, omzet_winkel_uid, omzet_ksp_uid,
 (SELECT omzet_bedrag FROM omzetten
  WHERE omzet_jaarmaand = '01/06/2006'
  AND omzetten.omzet_winkel_uid = omzet_winkel_uid
  AND omzetten.omzet_ksp_uid = omzet_ksp_uid) AS omzet_bedrag2
FROM omzetten WHERE omzet_jaarmaand = '01/06/2007'


In de subquery probeer ik dus te refereren naar de kolommen van de "main query"

Deze query wordt wel uitgevoerd en geeft dus geen foutmeldingen, echter is de waarde in kolom omzet_bedrag2 steeds hetzelfde. Hier zou dus de omzet van juni 2006 moeten staan voor die betreffende winkel+segment. Ik heb dus gekozen voor een subquery.

Ben ik in de goede richtig bezig of is het belachelijk/omslachtig wat ik probeer te doen?

Alvast _/-\o_

  • aukema
  • Registratie: December 2003
  • Laatst online: 08-12-2024
zoiets als:

select a.veldnaam, a.veldnaam2, (select b.veldnaam from tabel b where a.id = b.id) from tabel a

in de subquery leg je de relatie met de bovengenoemde query

  • Urk
  • Registratie: Maart 2000
  • Laatst online: 25-11 03:50
aukema schreef op dinsdag 13 november 2007 @ 21:07:
zoiets als:

select a.veldnaam, a.veldnaam2, (select b.veldnaam from tabel b where a.id = b.id) from tabel a

in de subquery leg je de relatie met de bovengenoemde query
Ja, dat begrijp ik, maar dat is nu net het probleem. Er is namelijk geen A en B maar alleen een A, met andere woorden: er is maar 1 tabel. Bovengenoemde gebruik ik ook vaker alleen dan met meerdere tabellen waardoor je de realatie prima kan leggen. Bij mijn voorbeeld hierboven gaat dat niet...
Hoe definieer ik dus het verschil tussen de omzetten tabel in de hoofdquery en de omzetten tabel in de subquery? :?

  • PaulZ
  • Registratie: Augustus 2004
  • Laatst online: 21-05-2024
De ene keer geef je de tabel 'omzetten' de naam A en de andere keer (in de subquery) de naam B
code:
1
2
3
select a.veldnaam, a.veldnaam2, 
(select b.veldnaam from OMZETTEN b where a.id = b.id) 
from OMZETTEN a

Vlinders moet je volgen, niet vangen...


  • Urk
  • Registratie: Maart 2000
  • Laatst online: 25-11 03:50
PaulZ schreef op dinsdag 13 november 2007 @ 22:21:
De ene keer geef je de tabel 'omzetten' de naam A en de andere keer (in de subquery) de naam B
code:
1
2
3
select a.veldnaam, a.veldnaam2, 
(select b.veldnaam from OMZETTEN b where a.id = b.id) 
from OMZETTEN a
_/-\o_ _/-\o_ Super! Hartelijk dank, ik wist niet dat je een tabel ook een andere naam kon geven... ;(

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Urk schreef op woensdag 14 november 2007 @ 01:21:
[...]

_/-\o_ _/-\o_ Super! Hartelijk dank, ik wist niet dat je een tabel ook een andere naam kon geven... ;(
Aliassen ;) d:)b

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • jvdmeer
  • Registratie: April 2000
  • Laatst online: 15:16
Om de performance nog te verhogen zou je een self-join kunnen gebruiken waarbij een extra voorwaarde wordt gebruikt dat er een jaar verschil inzit.
bv:
SQL:
1
2
3
4
SELECT a.veldnaam, b.veldnaam, a.veldnaam2 
  FROM omzetten a
  JOIN omzetten b ON a.id = b.id and b.omzetjaarmaand='01\06\2006'
  WHERE a.omzetjaarmaand='01\06\2007'


of
SQL:
1
2
3
4
SELECT a.veldnaam, b.veldnaam, a.veldnaam2 
  FROM omzetten a
  JOIN omzetten b ON a.id = b.id and datediff(year, b.omzetjaarmaand, a.omzetjaarmaand)=1
  WHERE a.omzetjaarmaand='01\06\2007'

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 28-11 08:35

curry684

left part of the evil twins

jvdmeer schreef op woensdag 14 november 2007 @ 11:44:
Om de performance nog te verhogen zou je een self-join kunnen gebruiken waarbij een extra voorwaarde wordt gebruikt dat er een jaar verschil inzit.
"We should forget about small efficiencies, say about 97% of the time: premature optimization is the root of all evil."
Een subquery die aan data uit de outer query refereert heet overigens een correlated subquery.

Professionele website nodig?


  • jvdmeer
  • Registratie: April 2000
  • Laatst online: 15:16
curry684 schreef op woensdag 14 november 2007 @ 11:57:

Een subquery die aan data uit de outer query refereert heet overigens een correlated subquery.
Die quote ken ik wel, maar deze vorm van optimaliseren kost bijna geen inzet. Vooral als je gewent om zulke queries altijd als self-join te schrijven. En (dat is persoonlijk) vind ik de self-join lekkerder lezen als een correlated subquery.

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 28-11 08:35

curry684

left part of the evil twins

Blijkbaar ken je de quote wel maar snap je 'm niet ;) De reden dat ik 'm aanhaalde was niet dat de optimalisatie teveel moeite zou kosten oid, maar dat ik niet verwacht dat ie enig boeiend effect heeft omdat de query optimizer van beiden vrijwel hetzelfde execution plan zal maken.

De strekking van de quote is "gebruik de code die je snapt, die je kunt verklaren en die je aan je opvolgers kunt uitleggen, daarmee voorkom je dat er fouten ontstaan door wijzigingen waarvan de voordelen niet tegen de nadelen opwegen".

Professionele website nodig?


  • Dido
  • Registratie: Maart 2002
  • Laatst online: 15:08

Dido

heforshe

offtopic:
Gelukkig ben ik kennelijk niet de enige volslagen idioot die een doodeenvoudige join een stuk simpeler vind lezen dan een subquery.
Ik heb uit een eerder topic waar ik een join voorstelde in plaats van een voor mij schier onleesbare subqueryconstructie geleerd dat het woord "join" voor velen kennelijk synoniem is met "moeilijk, onbegrijpelijk, afblijven".

Wat betekent mijn avatar?


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 28-11 08:35

curry684

left part of the evil twins

offtopic:
ik ben het er volstrekt mee eens dat de join leesbaarder is, en dat ie makkelijker te optimizen is voor de query optimizer van inferieurdere DBMS'en, ik probeer dat alleen niet aan de topicstarter op te dringen omdat ik dat vind :P

Professionele website nodig?

Pagina: 1