Toon posts:

[SQL] Eerder uitgevoerde berekening gebruiken in een select

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

Verwijderd

Topicstarter
Beste medegotters,

Ik denk dat de titel niet heel erg duidelijk is wat ik eigenlijk wil zeggen maar ik zal het laten zien aan de hand van mijn voorbeeld SQL query waar ik niet echt uit kom. Ik heb al gezocht op got en google maar kon echt niet het antwoord vinden.

Stel ik heb:
SQL:
1
2
3
4
5
6
7
8
9
10
11
 
select
 iets,
  case
    when iets2 <> 0 then (iets3/iets4) * 100 
  else
    0
  end as iets5,
 (iets5 * 8) as iets6
from
 tabel


Ik krijg een foutmelding dat als het laatste berekend moet worden(de iets6) die iets5 gebruikt en eerder berekend is.

Mijn vraag is: hoe kan ik een eerder berekend kolomnaam zoals iets5 gebruiken in een volgende berekening?

Het spijt me voor de onduidelijkheid maar ik had geen idee hoe ik dit beter kon formuleren.

Alvast heel erg bedankt voor het meedenken1

Verwijderd

SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
select
 iets,
  case
    when iets2 <> 0 then (iets3/iets4) * 100 
  else
    0
  end as iets5,
 (case
    when iets2 <> 0 then (iets3/iets4) * 100 
  else
    0
  end * 8) as iets6
from
 tabel


:?

  • Tijgertje84
  • Registratie: Augustus 2005
  • Laatst online: 04-06 14:43
maak je nog gebruik van aan andere taal als PHP oid?

je hebt dus meerdere queries neem ik aan?
q1 heeft als resultaat: 500
q2 heeft als resultaat: 400
en je wilt met q3 de waarde van q1 en q2 gebruiken?

want voor zover ik weet zal je je vorige berekeningen moeten opslaan in een waarde die je weer oproept in de volgende query.

edit:
waarmee heb je die reeds gemaakte berekeningen mee gemaakt??

[ Voor 10% gewijzigd door Tijgertje84 op 05-02-2007 14:58 ]

Intel© Conroe E6600 | Asus P5Q PRO Turbo | Sapphire Vapor-X HD5770 1GB | G.E.I.L. 2 GB DDR2-667 Kit CL4 4-4-12 | WD Caviar SE16 2x250GB (S-ATA2) (Raid0) | Sunbeam Trio | Chaintec CFT-500A | Windows XP Pro SP3 | Samsung Syncmaster S23A350H


  • Vozze
  • Registratie: December 2001
  • Laatst online: 09:51
Euhhh

SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
select 
 t1.iets,
 t1.iets5 * 8 as iets6
from ( 
select
 iets,
  case
    when iets2 <> 0 then (iets3/iets4) * 100 
  else
    0
  end as iets5
from
 tabel
) t1

[ Voor 3% gewijzigd door Vozze op 05-02-2007 15:01 ]

"He who thinks knows evertyhing, knows nothing" - Socrates


Verwijderd

Tijgertje84 schreef op maandag 05 februari 2007 @ 14:56:
maak je nog gebruik van aan andere taal als PHP oid?

je hebt dus meerdere queries neem ik aan?
q1 heeft als resultaat: 500
q2 heeft als resultaat: 400
en je wilt met q3 de waarde van q1 en q2 gebruiken?

want voor zover ik weet zal je je vorige berekeningen moeten opslaan in een waarde die je weer oproept in de volgende query.

edit:
waarmee heb je die reeds gemaakte berekeningen mee gemaakt??
volgens mij wil hij het resultaat van een berekening in de ene kolom gebruiken in een andere kolom in zijn select. Dat kan dus niet, maar je kan wel de berekening gewoon nog een keer toepassen in je andere kolom als je 'm daar ook nodig hebt. Typisch geval van 'ik zit te moeilijk te denken' als ik het goed inschat ;)

Verwijderd

Topicstarter
Eigenlijk bedoel ik in mijn eerste post staat er een berekening die iets5 genoemd word. Ik wil iets5 dan weer gebruiken in een volgende berekening maar ik krijg een fout te zien in oracle. De fout is <Invalid identifier iets5>.

Moet je iets5 apart declareren ofzo? om hem zo toch te gebruiken?

Verwijderd

Verwijderd schreef op maandag 05 februari 2007 @ 15:03:
Eigenlijk bedoel ik in mijn eerste post staat er een berekening die iets5 genoemd word. Ik wil iets5 dan weer gebruiken in een volgende berekening maar ik krijg een fout te zien in oracle. De fout is <Invalid identifier iets5>.

Moet je iets5 apart declareren ofzo? om hem zo toch te gebruiken?
eerst even mijn reacties lezen graag....
.
Verwijderd schreef op maandag 05 februari 2007 @ 14:59:
[...]

volgens mij wil hij het resultaat van een berekening in de ene kolom gebruiken in een andere kolom in zijn select. Dat kan dus niet, maar je kan wel de berekening gewoon nog een keer toepassen in je andere kolom als je 'm daar ook nodig hebt. Typisch geval van 'ik zit te moeilijk te denken' als ik het goed inschat ;)

[ Voor 33% gewijzigd door Verwijderd op 05-02-2007 15:04 ]


  • Vozze
  • Registratie: December 2001
  • Laatst online: 09:51
Verwijderd schreef op maandag 05 februari 2007 @ 15:04:
[...]

eerst even mijn reacties lezen graag.....
of die van mij :)

"He who thinks knows evertyhing, knows nothing" - Socrates


Verwijderd

Topicstarter
Verwijderd schreef op maandag 05 februari 2007 @ 14:59:
[...]

volgens mij wil hij het resultaat van een berekening in de ene kolom gebruiken in een andere kolom in zijn select. Dat kan dus niet, maar je kan wel de berekening gewoon nog een keer toepassen in je andere kolom als je 'm daar ook nodig hebt. Typisch geval van 'ik zit te moeilijk te denken' als ik het goed inschat ;)
Ja je hebt wel gelijk: dat is wat ik wil.

Maar is het performance technisch niet handiger om de berekening eenmaal uit te laten voeren? Daarom wilde ik hem graag hergebruiken.

Verwijderd

Topicstarter
sorry, jullie zijn zo snel ;-)

Verwijderd

Verwijderd schreef op maandag 05 februari 2007 @ 15:04:
[...]


Ja je hebt wel gelijk: dat is wat ik wil.

Maar is het performance technisch niet handiger om de berekening eenmaal uit te laten voeren? Daarom wilde ik hem graag hergebruiken.
wat denk je dat de performance loss is van zo'n berekening 2x uitvoeren? Ik heb daar wel eens tests meegedaan en het scheelt microsecondes in stresstests. Ik kan me niet voorstellen dat je die tijd niet hebt ;)

/edit wach ff, zal eens even een testje draaien

[ Voor 4% gewijzigd door Verwijderd op 05-02-2007 15:07 ]


Verwijderd

Topicstarter
Verwijderd schreef op maandag 05 februari 2007 @ 15:05:
[...]

wat denk je dat de performance loss is van zo'n berekening 2x uitvoeren? Ik heb daar wel eens tests meegedaan en het scheelt microsecondes in stresstests. Ik kan me niet voorstellen dat je die tijd niet hebt ;)

/edit wach ff, zal eens even een testje draaien
Dank jullie wel voor jullie reacties!

Maar ik denk namelijk van wel want die eerste berekening bevat namelijk ook een subselect. Ik had dat voor de duidelijkheid niet opgenomen in het voorbeeld.

Wat zou je dan aanraden in het geval met subselects?

Verwijderd

dan zou ik toch een wat specifieke query moeten zien, en ook weten hoe die subselect aangeroepen wordt.

Verwijderd

Topicstarter
Verwijderd schreef op maandag 05 februari 2007 @ 15:11:
dan zou ik toch een wat specifieke query moeten zien, en ook weten hoe die subselect aangeroepen wordt.
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
select
 iets,
  case
    when iets2 <> 0 then ((select sum(iets6) from tabel2)/iets4) * 100 
  else
    0
  end as iets5,
 (case
    when iets2 <> 0 then (iets5/iets4) * 100 
  else
    0
  end * 8) as iets6
from
 tabel


Dit is wat ik bedoel

[ Voor 5% gewijzigd door Verwijderd op 05-02-2007 15:17 ]


Verwijderd

hummm.... problemen zijn altijd lastiger dan ze op het eerste gezicht lijken. Of dit performt hangt van een heleboel zaken af:
a) is tabel2 heel groot of niet? en is hij goed geïndexeerd?
b) is iets2 in veel gevallen != 0? In dat geval zal hij vaak de subselect in moeten.
c) herkent de optimizer van Oracle in dit geval of dezelfde query twee keer uitgevoerd wordt? Waarschijnlijk wel, dan zal het op zich meevallen.

Los daarvan is dit geen fijne query, je moet voor (bijna) elke record in "tabel" nu in "tabel2" duiken, en daar ook nog een sommatie doen. Er zit zo te zien geen group by op, dus je telt alles uit "tabel2". In dat geval zou ik in PL/SQL eerst die sommatie in een variabele zetten en die meegeven aan de cursor.
Er zijn nogal wat scenario's denkbaar hier helaas ;) Ik zou het gewoon eens proberen en kijken of het performt (op een beetje realistische dataset!).

/edit die inline view van Vozze kan misschien toch van pas komen. Aangenomen dat er een FK relatie tussen tabel en tabel2 ligt, kan je misschien tabel2 als een inline view in je "from" clause plaatsen en daaraan refereren. ff geen tijd om een voorbeeldje te brouwen ;)

[ Voor 13% gewijzigd door Verwijderd op 05-02-2007 15:29 ]


Verwijderd

Topicstarter
Verwijderd schreef op maandag 05 februari 2007 @ 15:24:
hummm.... problemen zijn altijd lastiger dan ze op het eerste gezicht lijken. Of dit performt hangt van een heleboel zaken af:
a) is tabel2 heel groot of niet? en is hij goed geïndexeerd?
b) is iets2 in veel gevallen != 0? In dat geval zal hij vaak de subselect in moeten.
c) herkent de optimizer van Oracle in dit geval of dezelfde query twee keer uitgevoerd wordt? Waarschijnlijk wel, dan zal het op zich meevallen.

Los daarvan is dit geen fijne query, je moet voor (bijna) elke record in "tabel" nu in "tabel2" duiken, en daar ook nog een sommatie doen. Er zit zo te zien geen group by op, dus je telt alles uit "tabel2". In dat geval zou ik in PL/SQL eerst die sommatie in een variabele zetten en die meegeven aan de cursor.
Er zijn nogal wat scenario's denkbaar hier helaas ;) Ik zou het gewoon eens proberen en kijken of het performt (op een beetje realistische dataset!).

/edit die inline view van Vozze kan misschien toch van pas komen. Aangenomen dat er een FK relatie tussen tabel en tabel2 ligt, kan je misschien tabel2 als een inline view in je "from" clause plaatsen en daaraan refereren. ff geen tijd om een voorbeeldje te brouwen ;)
a. is groot en groeiende met 5000 records per dag. b. bij 40 % zal hij de select uit moeten voeren c. geen idee ik zal daar eens naar gaan kijken.

Ok, dankjewel voor je reactie en tips!
Pagina: 1