[SQL-Query] Data uit 3 tabellen, 3e tabel splitsen

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

  • Polderdijk
  • Registratie: December 2001
  • Laatst online: 09-08 20:34
Ik heb een database met 3 tabellen erin (Subnummer, FaktuurNummer, Onderaannemer) en nu heb ik een query gemaakt die bijna aan mijn wensen voldoen, maar zit nog met 1 dingetje wat ik nergens kan vinden.

Dit is de query die ik gebruik:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
SQL_STRING2 = 
"SELECT 
   * 
 FROM 
   Subnummer AS Sub, 
   FaktuurRegels AS Fak, 
   Onderaannemer AS Onder
 WHERE 
   Sub.Opdrachtgever LIKE '388261' AND 
   Sub.Fabriek <> '' AND 
   Sub.VerkoopPrijs <> 0 AND
   Sub.Subnummer = Fak.Subnummer AND 
   Onder.Subnummer = Sub.Subnummer AND 
   Fak.FaktuurDatum BETWEEN 
                #" & MaandEerste & "# AND 
                #" & MaandLaatste & "# AND 
   Onder.Bedrag <> 0 AND
    (Onder.Volgnummer LIKE '1' OR 
     Onder.Volgnummer LIKE '2' OR 
     Onder.Volgnummer LIKE '3')"


Als ik deze dan uitvoerd dan krijg ik netjes alle data wat ik wil hebben, maar ik heb daarbij wel een probleem. Ik haal een aantal bedragen uit het tabel subnummer EN faktuurRegel EN Onderaannemer.

Als er nu in het tabel Onderaannemer 2 regels onder 1 subnummer staan en ik gebruik in mijn ASP de Do While NOT RS.EOF dan krijg ik dus 2 regels waar de onderaannemer verschillende waarde's heeft, maar ik krijg uit de tabel Subnummer en Faktuurregel 2x de zelfde bedragen. Als ik dat dan optelt, dan klopt het dus niet, dan kloppen alleen de waardes wat ik uit Onderaannemer haalt.

Ik wil uit het tabel Onderaannemer 3 waarde's hebben. Als volgnummer =1 dan hoort het bijbehorende bedrag bij "Mourik", bij Volgnummer 2 bij "Brant" en bij Volgnummer 3 bij "R&M".

Is het niet mogelijk dat ik in de query een stukje erbij zet, en dat hij het in een andere naam zet. Ik heb wel eens een query gemaakt zoals dit: SELECT Month(Datum) AS Maand, en als ik dan in mijn asp Response.Write RS("Maand") doe dan krijg ik alleen de maand ipv de datum.

Is er ook zoiets mogelijk dat ik dus kan zeggen Response.Write RS("Mourik") dit ik dus het bedrag van Onderaannemer krijg als dus Volgnummer = 1

Ik hoop dat jullie een beetje begrijpen wat ik bedoel, zo niet, vraag het, dan leg ik het beter uit!


modbreak: Je newlines kun je natuurlijk ook op meer human readable plekken ipv het alleen smaller te maken

[ Voor 19% gewijzigd door Janoz op 30-06-2003 13:12 ]

Webhosting van SkyHost.nl: 25 Mb / 1 Gb windows hosting € 4,50 p/m excl.btw!


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 17-08 23:56

Janoz

Moderator Devschuur®

!litemod

Nou, je zou kunnen beginnen met je post wat overzichtelijker te maken... Een paar enters in je query zou een stuk schelen.. ;)

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


  • Polderdijk
  • Registratie: December 2001
  • Laatst online: 09-08 20:34
Janoz schreef op 30 June 2003 @ 12:55:
Nou, je zou kunnen beginnen met je post wat overzichtelijker te maken... Een paar enters in je query zou een stuk schelen.. ;)
Ik zag het inderdaad, het was niet echt makkelijk leesbaar, nu is het een stukje beter ;)

Webhosting van SkyHost.nl: 25 Mb / 1 Gb windows hosting € 4,50 p/m excl.btw!


  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

Als ik hem goed begrijp dan moet je met een group by op de onderaannemers aan de gang.

Who is John Galt?


  • OZ-Gump
  • Registratie: November 2002
  • Laatst online: 26-06 10:37

OZ-Gump

terug van weggeweest

Het lijkt er inderdaad op dat een group by en een Sum hier op zijn plaats zijn... Die kant zou je eens op kunnen zoeken.

My personal website


  • DeverauX
  • Registratie: Februari 2002
  • Niet online

DeverauX

Focus is everything

Inderdaad een GROUP BY op onder.subnummer. Daarnaast raad ik je aan in plaats van het statement LIKE gewoon '=' te gebruiken ;)

...whatever was distasteful or unpleasant or uncomfortable or painful - music could always soothe that.
All you have to do is reach out to beauty.
Quincy Jones


  • OZ-Gump
  • Registratie: November 2002
  • Laatst online: 26-06 10:37

OZ-Gump

terug van weggeweest

DeverauX schreef op 30 June 2003 @ 13:07:
Daarnaast raad ik je aan in plaats van het statement LIKE gewoon '=' te gebruiken ;)
Oeh... die had ik nog niet eens gezien. Als je een like gebruikt heeft je query volgens mij veel meer tijd nodig dan wanneer je een gewone = gebruikt. En aangezien je geen wildcards gebruikt in je zoekterm heeft het geen voordelen hier Like te gebruiken. De = is dus beter op zijn plaats.

My personal website


  • DeverauX
  • Registratie: Februari 2002
  • Niet online

DeverauX

Focus is everything

Als je een like gebruikt heeft je query volgens mij veel meer tijd nodig dan wanneer je een gewone = gebruikt.
Afhankelijk van welke database de TS gebruikt kan er wel gebruik gemaakt worden van eventueel geplaatste indices... mja dan nog zal het idd langzamer zijn dan gewoon gebruik te maken van een vergelijkende operator. :)

...whatever was distasteful or unpleasant or uncomfortable or painful - music could always soothe that.
All you have to do is reach out to beauty.
Quincy Jones


  • Polderdijk
  • Registratie: December 2001
  • Laatst online: 09-08 20:34
Oke, GROUP BY heb ik geprobeerd maar daar kreeg ik foutmeldingen. Ik zal ff een voorbeeldje maken van data in de tabellen, en het uiteindelijk resultaat wat ik over wil houden:

Tabel "Subnummer":
SubnummerOpdrachtgeverFabriekVerkoopPrijs
01.00388261R00 General€ 1.000,00

Tabel "FaktuurRegels":
SubnummerFaktuurDatumFaktuurBedrag
01.0030-6-03€ 1.000,00

Tabel "Onderaannemer":
SubnummerVolgnummerNaamBedrag
01.001Mourik€ 200,00
01.002Brant€ 15,30
01.003R&M€ 1,70

Nu als ik dus de Query erop los laat wil ik de volgende waarde's overhouden PER REGEL (Alles moet worden opgeteld per fabriek (doe ik buiten de query!) en per Volgnummer):
Subnummer = 01.00
Verkoopprijs = € 1.000,00
Mourik = € 200,00 (Dus volgnummer 1)
Brant = € 15,30 (volgnummer 2)
M&R = € 1,70 (volgnummer 3)

Ik hoop dat het nu een beetje duidelijk is wat ik dus wil hebben!

Maar ik ik dus mijn bestaande query uitvoerd op bovenstaande kolol krijg ik dit eruit
SubnummerVerkoopPrijsNaamBedrag
01.001.000,00Mourik€ 200,00
01.001.000,00Brant€ 15,30
01.001.000,00R&M€ 1,70

Dus ik krijg 3x de Verkoopprijs van € 1.000,-

[ Voor 38% gewijzigd door Polderdijk op 30-06-2003 13:48 ]

Webhosting van SkyHost.nl: 25 Mb / 1 Gb windows hosting € 4,50 p/m excl.btw!


  • DeverauX
  • Registratie: Februari 2002
  • Niet online

DeverauX

Focus is everything

Dus ik krijg 3x de Verkoopprijs van € 1.000,-
Dat lijkt me logisch! Hoe had je het liever gezien dan :?
Anyway je zal deze "dubbele" waarden in je applicatie moeten wegfilteren.

...whatever was distasteful or unpleasant or uncomfortable or painful - music could always soothe that.
All you have to do is reach out to beauty.
Quincy Jones


  • Polderdijk
  • Registratie: December 2001
  • Laatst online: 09-08 20:34
DeverauX schreef op 30 June 2003 @ 14:07:
[...]

Dat lijkt me logisch! Hoe had je het liever gezien dan :?
Anyway je zal deze "dubbele" waarden in je applicatie moeten wegfilteren.
Dat vraag ik juist hier hoe ik het moet doen, maar ik neem aan dat er wel wat aan de query gesleuteld kan worden zodat ik dat er direct uitkrijgt!

Dat is dus mijn vraag!

Webhosting van SkyHost.nl: 25 Mb / 1 Gb windows hosting € 4,50 p/m excl.btw!


  • DeverauX
  • Registratie: Februari 2002
  • Niet online

DeverauX

Focus is everything

Dat vraag ik juist hier hoe ik het moet doen, maar ik neem aan dat er wel wat aan de query gesleuteld kan worden zodat ik dat er direct uitkrijgt!
SQL:
1
Sub.Subnummer = Fak.Subnummer 

Aangezien je de tabel subnummer joined op onderaannemer krijgt elke row van onderaannemer de verkoopprijs mee, en alleen door het aanpassen van je query zal dit niet lukken.

...whatever was distasteful or unpleasant or uncomfortable or painful - music could always soothe that.
All you have to do is reach out to beauty.
Quincy Jones


  • Polderdijk
  • Registratie: December 2001
  • Laatst online: 09-08 20:34
DeverauX schreef op 30 June 2003 @ 14:16:
[...]

SQL:
1
Sub.Subnummer = Fak.Subnummer 

Aangezien je de tabel subnummer joined op onderaannemer krijgt elke row van onderaannemer de verkoopprijs mee, en alleen door het aanpassen van je query zal dit niet lukken.
Ik ben dus juist op zoek naar een functie om dat aan te passen.

Maar ik denk dat ik wat verzonnen hebt, maar dat ga ik ff testen en dan laat ik het wel weten of het gelukt is!

Webhosting van SkyHost.nl: 25 Mb / 1 Gb windows hosting € 4,50 p/m excl.btw!


  • Polderdijk
  • Registratie: December 2001
  • Laatst online: 09-08 20:34
Na een hoop getest en geprobeerd te hebben krijg ik het nog steeds niet voor mekaar :(

Ik denk dat het verstandig wordt dat ik de dubbele waarden uit ga filteren binnen mijn applicatie. Hoewel ik toch denk dat ik iets in de query aan kan passen maar ik zou het echt niet meer kunnen bedenken :)

Webhosting van SkyHost.nl: 25 Mb / 1 Gb windows hosting € 4,50 p/m excl.btw!


  • OZ-Gump
  • Registratie: November 2002
  • Laatst online: 26-06 10:37

OZ-Gump

terug van weggeweest

Ik vraag me ook echt af hoe je dat wil zien dan. Zie jij de dubbele waardes van verkoopprijs gewoon verdwijnen? En wil je dus een 'gat' in je query waar de dubbele waardes weggehaald worden en wel alle bedragen bij Bedrag blijven staan? Want dat is (uiteraard) niet zomaar mogelijk met een SQL-statement. Als je er maar een regel van wil maken die een totaalbedrag geeft kan dat met een group by en een sum. Anders zul je inderdaad binnen je eigen applicatie wat moeten knutselen aan je weergave van gegevens.

My personal website


  • Polderdijk
  • Registratie: December 2001
  • Laatst online: 09-08 20:34
OZ-Gump schreef op 01 juli 2003 @ 09:14:
Ik vraag me ook echt af hoe je dat wil zien dan. Zie jij de dubbele waardes van verkoopprijs gewoon verdwijnen? En wil je dus een 'gat' in je query waar de dubbele waardes weggehaald worden en wel alle bedragen bij Bedrag blijven staan? Want dat is (uiteraard) niet zomaar mogelijk met een SQL-statement. Als je er maar een regel van wil maken die een totaalbedrag geeft kan dat met een group by en een sum. Anders zul je inderdaad binnen je eigen applicatie wat moeten knutselen aan je weergave van gegevens.
Nou, ik ben niet echt een super ster met het verzinnen van een query, maar ik dacht dat ik een keer iets gelezen hebt op i-net dat je ook zoiets kan doen: (maar dit werkt uiteraard niet)

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
SQL_STRING2 = 
"SELECT 
   *
 FROM 
   Subnummer AS Sub, 
   FaktuurRegels AS Fak, 
   Onderaannemer AS Onder
 WHERE 
   Sub.Opdrachtgever LIKE '388261' AND 
   Sub.Fabriek <> '' AND 
   Sub.VerkoopPrijs <> 0 AND
   Sub.Subnummer = Fak.Subnummer AND 
   Fak.FaktuurDatum BETWEEN 
                #" & MaandEerste & "# AND 
                #" & MaandLaatste & "#,"
 SELECT
    Onder.Bedrag
 WHERE
    Onder.Volgnummer = '1'
 AS Mourik

Dus dat je een select uitvoerd met erachter AS Mourik, maar dan dit select op de goede plaats, maar ik weet niet OF dit kan, dus daarom vraag ik het hier!

Dan kan ik in mijn ASP gewoon Mourik = RS("Mourik") doen en ben ik klaar!

Maar als dit echt niet gaat dan moet ik het in mijn applicatie eruit filteren, maar ik heb uiteraard liever dat dit in de SQL gebeurd ipv mijn ASP-tje, omdat ik dan een temp enzo moet gaan bijhouden, en aangezien dat ik al een hoop databasen moet doorspeuren kan dit een hoop gezeur schelen!

Webhosting van SkyHost.nl: 25 Mb / 1 Gb windows hosting € 4,50 p/m excl.btw!


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

Dido

heforshe

Polderdijk schreef op 30 June 2003 @ 13:32:
Oke, GROUP BY heb ik geprobeerd maar daar kreeg ik foutmeldingen.
Dat zou t emaken kunnen hebben met je select *
Je moet een group by clause opnemen op alles dat je niet optelt of iets andrs mee doet.
Nu als ik dus de Query erop los laat wil ik de volgende waarde's overhouden PER REGEL (Alles moet worden opgeteld per fabriek (doe ik buiten de query!) en per Volgnummer):
Subnummer = 01.00
Verkoopprijs = € 1.000,00
Mourik = € 200,00 (Dus volgnummer 1)
Brant = € 15,30 (volgnummer 2)
M&R = € 1,70 (volgnummer 3)

Ik hoop dat het nu een beetje duidelijk is wat ik dus wil hebben!

Maar ik ik dus mijn bestaande query uitvoerd op bovenstaande kolol krijg ik dit eruit
SubnummerVerkoopPrijsNaamBedrag
01.001.000,00Mourik€ 200,00
01.001.000,00Brant€ 15,30
01.001.000,00R&M€ 1,70

Dus ik krijg 3x de Verkoopprijs van € 1.000,-
Het is me niet duidelijk wat je wilt hebben. Wil je nou in het bovenstaande voorbeeld nou drie rijen terug, en zo ja, hoe moet dat er dan exact uitzien, of wil je 1 rij terug met een variabel aantal kolommen met daarin de namen en bedragen? Dat laatste kan namelijk nooit (een variabel aantal kolommen opvragen)

Vergeet niet dat iedere rij die uit je query komt gegevens bevat die direct iets met elkaar te maken hebben, en dat die relaties op iedere rij van je query hetzelfde zijn (behoudens erg vage unions...)

[ Voor 7% gewijzigd door Dido op 01-07-2003 09:54 ]

Wat betekent mijn avatar?


  • Polderdijk
  • Registratie: December 2001
  • Laatst online: 09-08 20:34
Het is me niet duidelijk wat je wilt hebben. Wil je nou in het bovenstaande voorbeeld nou drie rijen terug, en zo ja, hoe moet dat er dan exact uitzien, of wil je 1 rij terug met een variabel aantal kolommen met daarin de namen en bedragen? Dat laatste kan namelijk nooit (een variabel aantal kolommen opvragen)
Wat ik wil is dus eigenlijk dit eruit:
SubnummerFabriekVerkoopprijsFaktuurBedragMourikBrantR&M
01.00R00 Generel€ 1.000,00€ 1.000,00€ 200,00€ 15,30€ 1,70

En dan Mourik, Brant en R&M zijn standaard (Uit onderaannemer met als selectie Subnummer en volgnummer 1 tot 3) en dat worden er niet meer of minder!

Webhosting van SkyHost.nl: 25 Mb / 1 Gb windows hosting € 4,50 p/m excl.btw!


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 17-08 23:56

Janoz

Moderator Devschuur®

!litemod

Dat zijn dingen die je in je view op moet lossen.

En waarom moet dit wel door de db gebeuren (het verzorgen van layout) en waarom niet het optellen?

En waarom gebruik je trouwens overal LIKE? En waarom gebruik je strings om getallen op te slaan?

[ Voor 25% gewijzigd door Janoz op 01-07-2003 10:26 ]

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


  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
SELECT Subnummer, Fabriek, Verkoopprijs, FaktuurBedrag,
   onder1.bedrag as 'Mourik',
   onder2.bedrag as 'Brant',
   onder3.bedrag as 'R&M'
 FROM 
   Subnummer AS Sub, 
   FaktuurRegels AS Fak, 
   Onderaannemer AS Onder1, 
   Onderaannemer AS Onder2, 
   Onderaannemer AS Onder3
 WHERE 
   Sub.Opdrachtgever LIKE '388261' AND 
   Sub.Fabriek <> '' AND 
   Sub.VerkoopPrijs <> 0 AND
   Sub.Subnummer = Fak.Subnummer AND 
   Onder1.Subnummer = Sub.Subnummer AND 
   Onder2.Subnummer = Sub.Subnummer AND 
   Onder3.Subnummer = Sub.Subnummer AND 
   Fak.FaktuurDatum BETWEEN 
                #" & MaandEerste & "# AND 
                #" & MaandLaatste & "# AND 
   Onder1.Bedrag <> 0 AND
   Onder2.Bedrag <> 0 AND
   Onder3.Bedrag <> 0 AND
    Onder1.Volgnummer = 1 AND
     Onder2.Volgnummer = 2 AND
     Onder3.Volgnummer =3

Blergh, vies.

Who is John Galt?


  • Polderdijk
  • Registratie: December 2001
  • Laatst online: 09-08 20:34
Janoz schreef op 01 juli 2003 @ 10:25:
Dat zijn dingen die je in je view op moet lossen.
Dus toch, jammer :(
En waarom moet dit wel door de db gebeuren (het verzorgen van layout) en waarom niet het optellen?
Omdat we in dit bedrijf te maken hebben met gekke databasen, voor elk ordernummer is hier voor gekozen om een apparte database voor aan te maken en daar zit ik dus nu mee opgescheept. Anders kon ik alles zo uit de DB al opgeteld eruit halen, maar dat gaat helaas nu niet. Ik heb nu een aantal arrays van de fabrieken aangemaakt, en in elke array gooi ik de juiste bedragen bij uit de database, en die wil ik dus op het eind van de rit door ASP op je scherm toveren. Maar als ik dus een query kon maken scheelde me dat weer een hoop tijd en rekenkracht voor meneer de IIS!
En waarom gebruik je trouwens overal LIKE? En waarom gebruik je strings om getallen op te slaan?
De LIKE's zijn in mijn script al vervangen door =-jes :)

Webhosting van SkyHost.nl: 25 Mb / 1 Gb windows hosting € 4,50 p/m excl.btw!


  • Polderdijk
  • Registratie: December 2001
  • Laatst online: 09-08 20:34
justmental schreef op 01 July 2003 @ 10:34:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
SELECT Subnummer, Fabriek, Verkoopprijs, FaktuurBedrag,
   onder1.bedrag as 'Mourik',
   onder2.bedrag as 'Brant',
   onder3.bedrag as 'R&M'
 FROM 
   Subnummer AS Sub, 
   FaktuurRegels AS Fak, 
   Onderaannemer AS Onder1, 
   Onderaannemer AS Onder2, 
   Onderaannemer AS Onder3
 WHERE 
   Sub.Opdrachtgever LIKE '388261' AND 
   Sub.Fabriek <> '' AND 
   Sub.VerkoopPrijs <> 0 AND
   Sub.Subnummer = Fak.Subnummer AND 
   Onder1.Subnummer = Sub.Subnummer AND 
   Onder2.Subnummer = Sub.Subnummer AND 
   Onder3.Subnummer = Sub.Subnummer AND 
   Fak.FaktuurDatum BETWEEN 
                #" & MaandEerste & "# AND 
                #" & MaandLaatste & "# AND 
   Onder1.Bedrag <> 0 AND
   Onder2.Bedrag <> 0 AND
   Onder3.Bedrag <> 0 AND
    Onder1.Volgnummer = 1 AND
     Onder2.Volgnummer = 2 AND
     Onder3.Volgnummer =3

Blergh, vies.
KIJK, thanx, ik wist gewoon dat het op zo'n soort manier moest kunnen, maar wat je aangeeft is dat het niet helemaal goed is, maar toch, ik ga het eens proberen!

Webhosting van SkyHost.nl: 25 Mb / 1 Gb windows hosting € 4,50 p/m excl.btw!


  • Polderdijk
  • Registratie: December 2001
  • Laatst online: 09-08 20:34
Oké, ik heb hem werkent, en hij doet het als een trein, dit is hem hoe die nu goed werkt!

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
SQL_STRING2 =
"SELECT
  Sub.Subnummer,
  Fak.Subnummer,
  Onder1.Subnummer,
  Onder2.Subnummer,
  Onder3.Subnummer,
  Sub.Fabriek,
  Sub.Opdrachtgever,
  Sub.VerkoopPrijs,
  Fak.FaktuurDatum,
  Fak.FaktuurBedrag,
  Onder1.Bedrag AS Brant,
  Onder2.Bedrag AS R_M,
  Onder3.Bedrag AS Mourik,
  Onder1.Volgnummer,
  Onder2.Volgnummer,
  Onder3.Volgnummer
FROM
  Subnummer AS Sub,
  FaktuurRegels AS Fak,
  Onderaannemer AS Onder1,
  Onderaannemer AS Onder2,
  Onderaannemer AS Onder3 
WHERE
  Sub.Opdrachtgever LIKE '388261' AND
  Sub.Fabriek <> '' AND
  Sub.VerkoopPrijs <> 0 AND
  Sub.Subnummer = Fak.Subnummer AND
  Onder1.Subnummer = Sub.Subnummer AND
  Onder2.Subnummer = Sub.Subnummer AND
  Onder3.Subnummer = Sub.Subnummer AND
  Fak.FaktuurDatum BETWEEN #" & MaandEerste & "# AND #" & MaandLaatste & "# AND
  Onder1.Volgnummer = '1' AND
  Onder2.Volgnummer = '2' AND
  Onder3.Volgnummer = '3'"

Webhosting van SkyHost.nl: 25 Mb / 1 Gb windows hosting € 4,50 p/m excl.btw!

Pagina: 1