Avatar billede krasmussen Nybegynder
19. august 2006 - 13:01 Der er 9 kommentarer og
1 løsning

Mere count & grouping

Fortsættelse af : http://www.eksperten.dk/spm/726764

Jeg har nu trukket flere felter ind fra tabellerne, så output skulle være i stil med:

(KommuneA)  (XX antal Borgere)  (Besøgstype 1) (YY antal timer)

osv. jfr. group by - jeg kan sådan godt se at den er gal i SQL'en, men ved ikke helt hvordag de sub-select's skal sættes rigtigt.
SQL er her:

SELECT Tmp.KommuneNummer, T_StamdataKommuner.Navn, Count(*) AS AntalBorgere, Sum(Tmp.BesoegPrBorger) AS AntalBesog, T_BorgerBesøgsCyklus.BesøgsType, Count(T_BorgerBesøgsCyklus.BesøgsType) AS AntalOfBesøgsType, DateDiff("n",[Fra kl],[Til kl]) AS Varighed
FROM T_BorgerBesøgsCyklus INNER JOIN (T_StamdataBorger INNER JOIN ([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 INNER JOIN T_StamdataKommuner ON Tmp.KommuneNummer = T_StamdataKommuner.Nummer) ON T_StamdataBorger.Kommune = T_StamdataKommuner.Nummer) ON T_BorgerBesøgsCyklus.CPR = T_StamdataBorger.CPR
GROUP BY Tmp.KommuneNummer, T_StamdataKommuner.Navn, T_BorgerBesøgsCyklus.BesøgsType, DateDiff("n",[Fra kl],[Til kl]);
Avatar billede kjulius Novice
19. august 2006 - 16:23 #1
Hvor kommer varighed ind i spillet?

Før havde du 3 niveauer:

1. Kommune (hvis borgere besøgte dit site)
2. Antal borgere (der besøgte dit site)
3. Antal besøg

Nu vil du så have tilføjet noget du kalder borgerbesøgscyclus og en varighed.
Hvad er borgerbesøgscyclus og hvilken varighed refereres der til?
Hvordan er relationerne mellem de "gamle" oplysninger og de nye?

Jeg er forvirret, for jeg synes ikke umiddelbart der er en sammenhæng, eller også er min fantasi bare for ringe. :-)
På hvilket niveau skal de nye tællere indplaceres?
Avatar billede krasmussen Nybegynder
19. august 2006 - 16:56 #2
Varighed er et felt i tabellen T_BorgerBesøgsCyklus... jeg har ændret i din SQL fra i går, så den nu ser sådanne ud, måske kaster det lidt lys over

SELECT Tmp.KommuneNummer, T_StamdataKommuner.Navn, Count(*) AS AntalBorgere, Tmp.Besøgstype, Sum(Tmp.BesoegPrBorger) AS AntalBesog
FROM [SELECT T_StamdataKommuner.Nummer as KommuneNummer, T_StamdataBorger.ID,T_Borgerbesøgscyklus.Besøgstype AS Besøgstype,  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_Borgerbesøgscyklus.Besøgstype,  T_StamdataBorger.ID]. AS Tmp INNER JOIN T_StamdataKommuner ON Tmp.KommuneNummer = T_StamdataKommuner.Nummer
GROUP BY Tmp.KommuneNummer, T_StamdataKommuner.Navn, Tmp.Besøgstype
Avatar billede krasmussen Nybegynder
19. august 2006 - 17:19 #3
Jeg fik skrevet noget vrøvl. Varighed er en beregnet værdi ud fra to felter: "Fra Kl." og "Til kl." - sorry
Avatar billede kjulius Novice
19. august 2006 - 17:25 #4
Hmm... Jeg tænker sløvt sådan er smuk lørdag eftermiddag (hvorfor sidder jeg egentlig her?), så hvordan ville du have løst det, hvis du havde haft mulighed for at bruge en COUNT(DISTINCT felt) funktion?
Avatar billede krasmussen Nybegynder
19. august 2006 - 17:35 #5
Den står også lidt stille her... egentlig mangler jeg også kun at så summeret tiden og vise summen grupperet på besøgstype...
Jeg tror ikke at distinct løser noget her. prøs at se denne:

SELECT Tmp.KommuneNummer, T_StamdataKommuner.Navn, Count(*) AS AntalBorgere, Tmp.Besøgstype, Sum(Tmp.BesoegPrBorger) AS AntalBesog, Tmp.GrupperetVarighed
FROM [SELECT T_StamdataKommuner.Nummer as KommuneNummer, T_StamdataBorger.ID,T_Borgerbesøgscyklus.Besøgstype AS Besøgstype,  Count(*) As BesoegPrBorger, T_BorgerBesøgsCyklus.[Til kl] -T_BorgerBesøgsCyklus.[Fra kl]
            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_Borgerbesøgscyklus.Besøgstype,  T_StamdataBorger.ID]. AS Tmp INNER JOIN T_StamdataKommuner ON Tmp.KommuneNummer = T_StamdataKommuner.Nummer
GROUP BY Tmp.KommuneNummer, T_StamdataKommuner.Navn, Tmp.Besøgstype;

Den kan ikke lide mine [] omkring feltet med et space i... er der en anden måde at skrive det på?
Avatar billede kjulius Novice
19. august 2006 - 18:09 #6
Nej, ikke mig bekendt. Men du mangler vist at navngive feltet, da du jo refererer til det i den ydre SELECT:

SELECT Tmp.KommuneNummer, T_StamdataKommuner.Navn, Count(*) AS AntalBorgere, Tmp.Besøgstype, Sum(Tmp.BesoegPrBorger) AS AntalBesog, Tmp.GrupperetVarighed
FROM [SELECT T_StamdataKommuner.Nummer as KommuneNummer, T_StamdataBorger.ID,T_Borgerbesøgscyklus.Besøgstype AS Besøgstype,  Count(*) As BesoegPrBorger, T_BorgerBesøgsCyklus.[Til kl] - T_BorgerBesøgsCyklus.[Fra kl] As GrupperetVarighed
            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_Borgerbesøgscyklus.Besøgstype,  T_StamdataBorger.ID]. AS Tmp INNER JOIN T_StamdataKommuner ON Tmp.KommuneNummer = T_StamdataKommuner.Nummer
GROUP BY Tmp.KommuneNummer, T_StamdataKommuner.Navn, Tmp.Besøgstype;
Avatar billede krasmussen Nybegynder
19. august 2006 - 18:27 #7
Ja - men den går stadig i fejl med: "Der er brugt ugyldige kantede parenteser omkring navnet... hvis jer erstatter dine [] ifb. med subselect med (), mangler udtrykket i Group By og uanset hvad jeg sætter ind dér, går den også i fejl??
Avatar billede kjulius Novice
19. august 2006 - 18:37 #8
I den indre subselect har du ikke det beregnede felt med i grupperingen, så prøv

SELECT Tmp.KommuneNummer, T_StamdataKommuner.Navn, Count(*) AS AntalBorgere, Tmp.Besøgstype, Sum(Tmp.BesoegPrBorger) AS AntalBesog, Tmp.GrupperetVarighed
FROM [SELECT T_StamdataKommuner.Nummer as KommuneNummer, T_StamdataBorger.ID,T_Borgerbesøgscyklus.Besøgstype AS Besøgstype,  Count(*) As BesoegPrBorger, T_BorgerBesøgsCyklus.[Til kl] - T_BorgerBesøgsCyklus.[Fra kl] As GrupperetVarighed
            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_Borgerbesøgscyklus.Besøgstype,  T_StamdataBorger.ID, T_BorgerBesøgsCyklus.[Til kl] - T_BorgerBesøgsCyklus.[Fra kl]]. AS Tmp INNER JOIN T_StamdataKommuner ON Tmp.KommuneNummer = T_StamdataKommuner.Nummer
GROUP BY Tmp.KommuneNummer, T_StamdataKommuner.Navn, Tmp.Besøgstype;
Avatar billede krasmussen Nybegynder
19. august 2006 - 21:25 #9
Nå med brug af din(e) SQL - lidt flytten rundt og en rapport ovenpå, så er det lykkedes.

Tak for hjælpen...og så på en lørdag :-)

Lægger du et svar igen.
Avatar billede kjulius Novice
19. august 2006 - 22:44 #10
Glad to...
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