Avatar billede krasmussen Nybegynder
17. august 2006 - 15:26 Der 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:

GruppereFeltTabel-3  SumFeltXTabel-1  SumFeltYTabel-2

Problemet er at i summerne vises begge steder SumFeltYTabel-2 som er den tabel der indeholder flest poster.

Tabel-2 fungerer som undertabel tl tabel-1. Der er selvfølgelig join mellem de to, samt mellem Tabel-3 og Tabel-1 IKKE mellem Tabel-2 og Tabel-3

Hvordan laver jeg en forespørgsel / SQL som kan håndtere dette korrekt...?
Avatar billede kjulius Novice
17. august 2006 - 16:31 #1
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... :-)
Avatar billede krasmussen Nybegynder
17. august 2006 - 16:51 #2
SQL er her:

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;
Avatar billede krasmussen Nybegynder
17. august 2006 - 16:54 #3
Der er et antal poster i t_borberbesøgscyklus pr. post i t_stamdataborger.

Count på t_stamdataborger viser resultet af count på t_borgerbesøgscyklus ?
Avatar billede kjulius Novice
17. august 2006 - 17:04 #4
Men indtil du kommer ud af busken :-), så kunne vi jo gøre lige det (gætte):

Hvis du har tre tabeller:

Tabel3:
Id, gruppefelt
Tabel2:
Id, feltA
tabel3:
Id, feltB

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...
Avatar billede kjulius Novice
17. august 2006 - 17:10 #5
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.
Avatar billede krasmussen Nybegynder
17. august 2006 - 17:13 #6
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
Avatar billede kjulius Novice
17. august 2006 - 17:22 #7
Prøv:

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;
Avatar billede kjulius Novice
17. august 2006 - 17:38 #8
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 :-)
Avatar billede krasmussen Nybegynder
17. august 2006 - 18:09 #9
Jeg prøver den seneste, det er faktisk og hensigten at der kun skal tælles borgere med besøg :-)
Avatar billede krasmussen Nybegynder
17. august 2006 - 21:46 #10
Det var jo bare smukt... der er et par udfordringer mere, men jeg leger lidt med det selv, inden jeg evt. melder mig igen.

Tak for hjælpen - lægger du et svar.
Avatar billede kjulius Novice
17. august 2006 - 21:58 #11
Det kan du tro!... :-)
Avatar billede krasmussen Nybegynder
19. august 2006 - 13:02 #12
Måske du kan hjælpe med fortsættelsen... :-)  http://www.eksperten.dk/spm/727092
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

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