14. juli 2008 - 17:23Der 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?
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).
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"))
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
Synes godt om
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"));
Synes godt om
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!~)
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?
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.
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?
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?
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.