17. august 2006 - 15:26Der er
11 kommentarer og 1 løsning
Count & grouping
Jeg er ved at lave en - egentlig simpel optælling af poster fra 2 tabeller med en gruppering på et felt fra en tredje tabel. output skal være ca. sådan:
Det ville være lidt lettere, hvis du viste os din SQL som den ser ud nu. Evt. også hvordan dine tabeller ser ud og beskrivelse af relationerne. Ellers kan vi kun gætte... :-)
SELECT T_StamdataKommuner.Nummer as KommuneNummer, Count(T_StamdataBorger.ID) AS AntalBorgere, Count(T_BorgerBesøgsCyklus.Id) AS AntalBesog FROM (T_BorgerBesøgsCyklus INNER JOIN T_StamdataBorger ON T_BorgerBesøgsCyklus.CPR = T_StamdataBorger.CPR) INNER JOIN T_StamdataKommuner ON T_StamdataBorger.Kommune = T_StamdataKommuner.Nummer GROUP BY T_StamdataKommuner.Nummer;
og relationerne er (inner joins) Tabel3.gruppefelt=Tabel2.Id og Tabel2.FeltA=Felt3.Id
så kunne du oprette to forespørgsler, S1 og S2:
S1: SELECT gruppefelt, FeltA, COUNT(*) as outerCount FROM Tabel3, Tabel1, Tabel2 WHERE tabel3.gruppefelt = tabel1.Id And Tabel1.FeltA = Tabel2.Id GROUP BY gruppefelt, FeltA
S2: SELECT gruppefelt, COUNT(*) As Tabel1_Antal, SUM(outerCount) As Tabel2_Antal FROM S1 GROUP BY gruppefelt
Eller hvis du f.eks. skal bruge det i ASP (eller du bare vil skære ned på antallet af forespørgsler), så understøtter Access faktisk også dette format:
SELECT gruppefelt, COUNT(*) As Tabel1_Antal, SUM(outerCount) As Tabel2_Antal FROM (SELECT gruppefelt, FeltA, COUNT(*) as outerCount FROM Tabel3, Tabel1, Tabel2 WHERE tabel3.gruppefelt = tabel1.Id And Tabel1.FeltA = Tabel2.Id GROUP BY gruppefelt, FeltA) As S1 GROUP BY gruppefelt
Men... der er naturligvis også andre muligheder, afhængigt af dine tabeller og relationer, så det er nok bedst at vi venter...
Oops, du var kommet med yderligere information. Det skulle jeg vist have tjekket, før jeg trykkede på Send.
Generelt, så vil en COUNT(feltnavn) returnere antallet af returnerede rows, hvor feltet ikke er null (altså indeholder en værdi). Hvis du ønskede en count af forskellige id i en af tabellerne, skulle du have brugt en COUNT(DISTINCT id). Desværre understøtter Access ikke den funktion.
Du er derfor nødt til at opdele din forespørgsel for at kunne returnere antallet af rækker i begge tabeller, sådan som jeg forsøgte at vise i min (lidt for tidlige) forklaring.
ok - jeg har faktisk også forsøgt mig med DISTINCT...men det virkede, som du ved, ikke - jeg forsøger med din select i en forespørgsel og vender tilbage lidt senere
SELECT KommuneNummer, Count(*) AS AntalBorgere, Sum(BesoegPrBorger) AS AntalBesog FROM ( SELECT T_StamdataKommuner.Nummer as KommuneNummer, T_StamdataBorger.ID, Count(*) As BesoegPrBorger FROM (T_BorgerBesøgsCyklus INNER JOIN T_StamdataBorger ON T_BorgerBesøgsCyklus.CPR = T_StamdataBorger.CPR) INNER JOIN T_StamdataKommuner ON T_StamdataBorger.Kommune = T_StamdataKommuner.Nummer GROUP BY T_StamdataKommuner.Nummer, T_StamdataBorger.ID) As Tmp GROUP BY KommuneNummer;
Forresten - din counter for AntalBorgere vil kun vise antallet af borgere der har været på besøg. Det er forhåbentligt også det du tilsigter. Ellers duer en inner join ikke. Et bedre feltnavn ville være "Antal Borgere På Besøg" (men det ville næsten være et "indianer" navn :-)
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.