Toon posts:

[SQL] hulp met sql kruistabelquery

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

Verwijderd

Topicstarter
Mensen,
Ik heb jullie hulp nodig.


Mijn sql:

TRANSFORM Max(T7.weeknr) AS MaxVanweeknr
SELECT NAW.kaartnr, NAW.plaats, NAW.naam, PI.jaar
FROM slachterij AS S INNER JOIN (NAWgegevens AS NAW INNER JOIN (CPeriodeIndeling AS PI INNER JOIN T7_Binnenkomst AS T7 ON (PI.weeknr = T7.weeknr) AND (PI.jaar = T7.jaar)) ON NAW.nawID = T7.slachterijID) ON S.nawID = NAW.nawID
GROUP BY NAW.kaartnr, NAW.plaats, NAW.naam, PI.jaar
PIVOT PI.weeknr;


Mijn probleem:
Ik wil namelijk één sql kruistabel maken met én alle kolomkop gegevens van T7.weeknr én alle gegevens uit de rijkop NAW.kaartnr.

Als ik het zomaar met relatie aan de slag ga dan is het de één of de andere!

Kan iemand mij helpen?

Alvast erg bedankt

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

Ik kan hier verdomd weinig mee.... :/
• Welk DBMS gebruik je?
• Welke resultaten krijg je nu en op welke manier wijken die af van de gewenste?
• Wat heb je al verder geprobeerd dan die ene query en waarom werkten die versies niet?

Professionele website nodig?


Verwijderd

Topicstarter
Ik geef een makkelijker voorbeeld:

Stel je hebt:
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
voornaam tabel
vID   |   voornaam
 1          Jan
 2          Piet
 3          Klaas
 4          Peter

Achternaam tabel
aID   |   achternaam
 1          Klaassen
 2          Janssen
 3          Vries
 4          Paulusma

en een koppel tabel
kID   |   vID   |   aID
 1          1       1
 2          2       1
 3          3       3
 4          4       4

Dus de namen zijn:
Jan Klaassen
Piet Klaassen
Klaas Vries
Peter Paulusma

De achternaam "Janssen" komt dus niet voor bij de voornamen

PROBLEEM:
Ik wil een kruistabel maken met alle voornamen én alle achternamen:
          Klaassen          Janssen          Vries          Paulusma
Jan          X
Piet         X
Klaas                                           X
Peter                                                           X

Maar als ik deze sql gebruik krijg ik kolom janssen er niet bij:

TRANSFORM Max(koppel.kID) AS MaxVankID
SELECT voornaam.voornaam
FROM achternaam INNER JOIN (voornaam INNER JOIN koppel ON voornaam.vID = koppel.vID) ON achternaam.aID = koppel.aID
GROUP BY voornaam.voornaam
PIVOT achternaam.achternaam;

Dus mijn vraag is hoe kan ik er voor zorgen dat én alle voornamen in de rijen komen én alle achternamen in de koppen komen?

Als het nog niet duidelijk is hoor ik het graag;

Mijn dank

[ Voor 3% gewijzigd door Verwijderd op 23-07-2004 13:22 ]


  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
En als curry er al niets mee kan, hoe zit het dan met de minder briljante maar toch hulpvaardige rest ;)

Geef eens iets meer context, want wij werken nu eenmaal niet mee aan die opdracht van je. Globaal overzichtje van de betreffende tabellen en hun primaire sleutels e.d.
En probeer eens te omschrijven welke gegevens je eigenlijk probeert samen te voegen en gebruik daarvoor natuurlijke taal zonder te verwijzen naar onderdelen van je query. Ik denk graag met je mee, maar ik (en ik denk anderen met mij) kan eventuele denkfouten van jouw kant niet opsporen zonder het grote plaatje.

edit:
spuit 11. crap, je was me voor, daar gaat het nut van dit prachtige stukje proza.

[ Voor 8% gewijzigd door bigbeng op 23-07-2004 13:24 ]


  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
outer join is je vriend... Je wilt alles hebben, ook als er geen tegenhanger bestaat in de andere tabel. Dit is iets wat je typisch met een outer join oplost.

En ik denk dat je eerste inner join dus een outer join moet worden.

[ Voor 19% gewijzigd door bigbeng op 23-07-2004 13:27 ]


Verwijderd

Topicstarter
Ik wil dan twee outer joins!
1) Van de voornaam tabel naar koppeltabel
2) Van de achternaam tabel naar koppeltabel

En dat accepteert hij dat één tabel(koppeltabel) van twee kanten benaderd wordt:

voornaam -----> koppeltabel <----- achternaam

Dus dat werkt niet; Dat is namelijk het probleem

Verwijderd

Moet het persé in één query? Als je er wat code bij mag kloppen wordt het namelijk een stuk makkelijker...

  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
Waarom werkt dat niet? Dat is toch gewoon toegestaan? Volgens mij heb ik wel vaker een left en een right outer join tegelijk gebruikt. Het zou dan iets worden in de trant van
code:
1
voornaam right outer join koppel left outer join achternaam

Verwijderd

Topicstarter
He bigbeng, misschien maak ik een fout; zou je deze sqlString in een outer join willen maken:

TRANSFORM Max(koppel.kID) AS MaxVankID
SELECT voornaam.voornaam
FROM achternaam inner JOIN (voornaam INNER JOIN koppel ON voornaam.vID = koppel.vID) ON achternaam.aID = koppel.aID
GROUP BY voornaam.voornaam
PIVOT achternaam.achternaam;

_/-\o_ DANK

Dan weet ik hoe het ook alweer moet met de outer joins

  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
Ik had hem bijkans al gegeven, maar hier even uitgewerkt. Je mag blij zijn dat ik in zo'n goede bui ben :D :

TRANSFORM Max(koppel.kID) AS MaxVankID
SELECT voornaam.voornaam
FROM achternaam RIGHT OUTER JOIN koppel ON achternaam.aID = koppel.aID LEFT OUTER JOIN voornaam ON voornaam.vID = koppel.vID
GROUP BY voornaam.voornaam
PIVOT achternaam.achternaam;

Problemen treden natuurlijk op als het SQL dialect van jouw DBMS geen RIGHT OUTER JOIN ondersteunt. Maar goed, dan kijken we wel weer verder.

Verwijderd

Topicstarter
Bigbeng tot nu toe super bedankt, maar ik krijg een fout:

Microsoft JET Database Engine error '80040e14'

Syntaxisfout (operator ontbreekt) in query-expressie achternaam.aID = koppel.aID LEFT OUTER JOIN voornaam ON voornaam.vID = koppel.vID.

/outerjoin.asp, line 40


Denk niet dat die ondersteund wordt?

code:
1
2
3
4
5
6
7
8
9
10
sqlString = "TRANSFORM Max(koppel.kID) AS MaxVankID " & _
            "SELECT voornaam.voornaam " & _
            "FROM achternaam RIGHT OUTER JOIN koppel ON achternaam.aID = koppel.aID LEFT OUTER JOIN voornaam ON voornaam.vID = koppel.vID " & _
            "GROUP BY voornaam.voornaam " & _
            "PIVOT achternaam.achternaam;"
    
    Set oConn = Server.CreateObject("ADODB.Connection")
    oConn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Documents and Settings\jtraa.CBS\Bureaublad\db1.mdb"
    set oRs = CreateObject("ADODB.Recordset")
    oRs.open sqlString, oConn, 1, 1


Weet jij hoe ik deze blokkade uit de weg kan ruimen?

  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
Transform had mij misschien moeten waarschuwen met welk DBMS je bezig was.
Ik vrees dat Access geen outer joins ondersteunt, ook volgens diverse bronnen op het net.

Verwijderd

Topicstarter
Heb jij enig idee hoe ik dit kan oplossen! Database moet access blijven, helaas!

  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
Ik heb nog even verder gekeken en een outer join in access wordt gedaan met LEFT JOIN of RIGHT JOIN. Echter, kruistabelqueries met zulk een join type vind ie niet echt leuk en geeft bij mij een foutmelding. Er wordt wel een oplossingsrichting geboden, maar mijn feeling voor Access is niet voldoende om te begrijpen wat ik precies moet doen om het probleem op te lossen.

Dit is de query waarmee ik uiteindelijk vastloop:
code:
1
2
3
4
5
TRANSFORM Count(koppel.kID) AS AantalVankID
SELECT voornaam.voornaam
FROM (achternaam LEFT JOIN koppel ON achternaam.aID = koppel.aID) RIGHT JOIN voornaam ON koppel.vID = voornaam.vID
GROUP BY voornaam.voornaam
PIVOT achternaam.achternaam;


Misschien dat jij er wel iets mee kan?

Verwijderd

Topicstarter
Thanks; Bigbeng;

Bedankt voor je hun, ik weet dat access left/right join niet ondersteunt;
Ik ga maar opzoek naar andere oplossingen!

thnx,
Pagina: 1