Avatar billede jewo Nybegynder
14. juli 2008 - 17:23 Der er 9 kommentarer og
4 løsninger

Kompliceret forespørgsel

Hej eksperter,

Jeg arbejder med en database over projekter med danske og udenlandske deltagere. Jeg ønsker at se på, hvor mange projekter danske og svenske deltagere samarbejder om.

Min database rummer 3 variable fordelt på 2 tabeller:

Tabel 1:
- Projektnumre (= projekter -> hvert projekter har unikt nummer)

Tabel 2:
- Projektnumre
- Deltagere
- Landekoder

Følgelig kan jeg 'joine' mine to tabeller på baggrund af projektnumre, således at hver deltager får et projekternummer. Herefter kan jeg sortere deltagerne og deres projektnumre ud fra landekoder. Sorterer jeg ud fra "DK" får jeg 1.643 danske deltagere fordelt på og 1.123 projekter - altså flere deltagere per projekt.

Hvis jeg fjerner dubletter fra listen over danske deltagere skulle jeg meget gerne nå frem til 1.123 projektnumre. Teoretisk set er jeg så i stand til at finde frem til Danmarks svenske samarbejdspartnere, ved at bruge de 1.123 projektnumre som kriterie for projekter med svenske deltagere.

Men kan det overhovedet lade sig gøre, at sortere på så mange kriterier?
              [Så vidt jeg kan gennemskue, kræver min metode, at jeg først opretter en ny tabel med danske projekternumre, og så joiner den med listen over deltagere. Herefter ville jeg så kunne sortere deltagerne med svensk ladekode som kriterie.]

- Og er der (forhåbentligtvis) ikke en nemmere metode?

/Jeppe
Avatar billede fdata Forsker
14. juli 2008 - 17:55 #1
Det behøver ikke være så kompliceret. Princippet er:

1. Opret en sumforespørgsel (klik på sigma-tegnet) baseret på Tabel2, som udvælger Projektnumre og med kriteriet at Landekode skal være Danmark.
2. Gem den (vi kalder den her Query_DK)
3. Opret en ny forespørgsel, hvor du medtager både Tabel 2 og Query_DK.
4. Træk med musen fra Projektnumre i Tabel 2 over på Projektnumre i Query_DK. Så dannes en 1-1 relation (du ser en streg)
5. Indtast kriteriet: Tabel2.Landekode = Sverige
Nu burde du se en liste over dine Tabel2 poster, som er begrænset både af Danmark (de er begrænset til posterne i Query_DK) og af Sverige (kriteriet).
Avatar billede terry Ekspert
14. juli 2008 - 18:24 #2
If you only want to see wjich projects both Danish and Swedish participate in then you can use.

SELECT DISTINCT DK.Projektnumre, DK.LandeKode, se.lANDEkODE
FROM Table2 AS DK INNER JOIN (select DISTINCT PROJEKTNUMRE, LANDEKODE FROM Table2 where lANDEKODE = "se")  AS se ON DK.Projektnumre = se.Projektnumre
WHERE (((DK.LandeKode)="dk"))
Avatar billede kjulius Novice
14. juli 2008 - 20:08 #3
SELECT T1.Projektnummer, SUM(IIf(T2.Landekode = 'DK', 1, 0)) AS DKdeltagere, SUM(IIf(T2.Landekode <> 'DK', 1, 0)) AS DeltagereUdland
FROM Tabel1 T1 INNER JOIN Tabel2 T2 ON T1.Projektnummer = T2.Projektnummer
GROUP BY T1.Projektnummer
HAVING SUM(IIf(T2.Landekode = 'DK', 1, 0)) > 0 AND SUM(IIf(T2.Landekode <> 'DK', 1, 0)) > 0

Med den nævnte tabelstruktur er det jo egentlig ikke nødvendigt at medtage Tabel1 (med mindre, der skal medtages andre felter, som beskriver projektet - disse vil i så fald skulle placeres i GROUP BY). Så en afkortet version kunne være:



SELECT Projektnummer, SUM(IIf(Landekode = 'DK', 1, 0)) AS DKdeltagere, SUM(IIf(Landekode <> 'DK', 1, 0)) AS DeltagereUdland
FROM Tabel2
GROUP BY Projektnummer
HAVING SUM(IIf(Landekode = 'DK', 1, 0)) > 0 AND SUM(IIf(Landekode <> 'DK', 1, 0)) > 0
Avatar billede Slettet bruger
14. juli 2008 - 23:35 #4
Prøv lige den her!~)

Der er kun brug for Tabel2, men du tager den ind i din forespørgsel 2 gange. Default bliver den anden kaldt Tabel2_1. Så finder du danskere i den ene, svenskere i den anden og laver en relation mellem løbenumrerne. Så kan du tælle projekter, summere danskere fra den ene tabel og summere svenskere fra den anden... Det ser sådan ud:

SELECT Count(Tabel2.Projektnumre) AS AntalProjekter, Sum(Tabel2.Deltagere) AS Danskere, Sum(Tabel2_1.Deltagere) AS Svenskere
FROM Tabel2 INNER JOIN Tabel2 AS Tabel2_1 ON Tabel2.Projektnumre = Tabel2_1.Projektnumre
GROUP BY Tabel2.Landekoder, Tabel2_1.Landekoder
HAVING (((Tabel2.Landekoder)="DK") AND ((Tabel2_1.Landekoder)="SE"));
Avatar billede Slettet bruger
14. juli 2008 - 23:38 #5
Nu nævnte du ikke noget om antal danske og svenske deltagere, men relation og kriterier er de samme, så... det er da også en meget sjov oplysning!~)
Avatar billede jewo Nybegynder
15. juli 2008 - 09:13 #6
Tak for svar!

De faldt prompte og gav god mening.

/Jeppe
Avatar billede terry Ekspert
15. juli 2008 - 09:44 #7
selv tak
Avatar billede jewo Nybegynder
15. juli 2008 - 10:27 #8
Lige en opfølger:

Når jeg fra tabel 2 udvælger projektnumre og summerer danskere, så får jeg 1.125 projekter. Men når jeg anvender data fra tabel 1 til at beskrive mine projekter (= tilføjer kolonner til min tabel), så får jeg 1.123.

Jeg holder på at 1.123 er det rigtige tal. Det skyldes, at der med min accessdatabase fulgte et præ-designet, mere brugervenligt forespørgsels-interface. Herfra kan man uden kendskab til access lave udtræk til excel, og gennem dette interface får jeg også tallet 1.123.

Men hvad skyldes de ekstra 2 projektnr./rækker med projekter i tallet 1.125? Jeg har undersøgt for dubletter, men fandt ingen. Er der en simpel, logisk forklaring på uoverensstemmelsen?
Avatar billede kjulius Novice
15. juli 2008 - 18:58 #9
Den mest indlysende forklaring er vel, at der findes et par "forældreløse" rækker i Tabel2. Hvis det er rigtig, burde du hurtigt kunne identificere dem ved en OUTER JOIN, f.eks. en LEFT OUTER JOIN:

SELECT Tabel2.*
FROM Tabel2
LEFT JOIN Tabel1 ON Tabel1.Projektnummer = Tabel2.Projektnummer
WHERE Tabel1.Projektnummer IS NULL

Den forespørgsel vil vælge de rækker i Tabel2 som er "orphans" i forhold til Tabel1.
Avatar billede jewo Nybegynder
16. juli 2008 - 10:31 #10
Hej kjulius

Jeg tror du har fat om problemet. Når jeg kører din forespørgsel får jeg et dataark med 105 rækker for alle lande. Men eftersom jeg kun interesserer mig for danske projektnumre får jeg her 3, hvoraf de to er ens. Med andre ord lister forespørgslen 2 "forældreløse" projektnumre. Disse projektnumre er derfor heller ikke med i min "rigtige" liste over 1.123 danske projektnumre.

Men jeg er ikke helt sikker på, hvad du mener med forældreløse rækker?
Avatar billede kjulius Novice
16. juli 2008 - 10:40 #11
At de er forældreløse, betyder at der i din Tabel2 befinder sig rækker, som ikke kan relatere sig til en projektbeskrivelse i din Tabel1. Måske er det nedlagte projekter, hvor kun projektbeskrivelsen i Tabel1 er slettet, mens projektdeltagerne i din Tabel2 ikke er blevet slettet samtidigt?
Avatar billede jewo Nybegynder
16. juli 2008 - 10:52 #12
Det lyder fornuftigt - tak.
Avatar billede fdata Forsker
16. juli 2008 - 21:48 #13
Takker for point  ;o)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Dyk ned i databasernes verden på et af vores praksisnære Access-kurser

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester



IT-JOB

LARS LARSEN GROUP

Project Manager, Digital & It

RISMA Systems A/S

Senior PHP-udvikler

Udviklings- og Forenklingsstyrelsen

Generalist til PMO