/ Forside / Teknologi / Udvikling / SQL / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
SQL
#NavnPoint
pmbruun 1704
niller 962
fehaar 730
Interkril.. 701
ellebye 510
pawel 510
rpje 405
pete 350
gibson 320
10  smorch 260
SQL - Count ?
Fra : SpookiePower


Dato : 15-11-07 11:13

Jeg har et problem med at ligge nogle tal sammen.

Jeg har en tabel som hedder TReport som indeholder
to kolonner iTeam1 og iTeam2. Jeg har så 3 hold 1 + 2 + 3
som kan forekomme i begge kolonner. Jeg vil nu gerne have
lagt sammen hvor ofte hvert hold forekommer i disse
kolonner tilsammen, men da hvert hold også har et navn, er jeg
nød til at lave en INNER JOIN til en anden tabel for
at hente navnet.

Her er mit eget forslag -

SELECT Holdnavn, count(iTeam1+iTeam2) AS Forekomster
FROM TReport INNER JOIN TTeam ON TReport.iTeam1=TTeam.id
WHERE iTeam1=11 Or iTeam1=12 Or iTeam1=13 iTeam2=11 Or iTeam2=12 Or
iTeam2=13
GROUP BY Holdnavn
ORDER BY count(iTeam1+iTeam2) DESC;

Men som i kan se, i denne linie
FROM TReport INNER JOIN TTeam ON TReport.iTeam1=TTeam.id

Så skulle jeg vel også have TReport.iTeam2=TTeam.id med....tror jeg.

Hvordan jeg ligger to koloner sammen er også et problem.
Jeg har prøvet både med SUM og Count, men uden held.

Mit færdige resultat skulle gerne se ud som følger -

Rødstue   100   
Blåstue   80
Gulstue 50
...
...
...



 
 
Jens Gyldenkærne Cla~ (15-11-2007)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 15-11-07 19:31

SpookiePower skrev:

> Jeg har et problem med at ligge nogle tal sammen.
>
> Jeg har en tabel som hedder TReport som indeholder
> to kolonner iTeam1 og iTeam2. Jeg har så 3 hold 1 + 2 + 3
> som kan forekomme i begge kolonner. Jeg vil nu gerne have
> lagt sammen hvor ofte hvert hold forekommer i disse
> kolonner tilsammen, men da hvert hold også har et navn, er jeg
> nød til at lave en INNER JOIN til en anden tabel for
> at hente navnet.

I sådan en situation bør du starte med at få sammentællingen på
plads uden navnet (med med dit id-nummer eller lignende) - og
herefter koble navnet på med et join.

Dine to kolonner med ensartede data tyder på at din datastruktur
ikke er normaliseret - et alternativ kunne være at have ét felt til
teamnummeret og et andet til at bestemme rollen (1 eller 2).

Men du kan samle de to felter til et med en UNION-forespørgsel:

   SELECT iTeam1 as Team
   FROM TReport
   UNION ALL
   SELECT iTeam2
   FROM TReport

Denne forespørgsel kan så aggregeres så du får antallet pr Teamnr:


   SELECT Team, COUNT(*) AS Antal
   FROM (
       SELECT iTeam1 as Team
       FROM TReport
       UNION ALL
       SELECT iTeam2
       FROM TReport
   )
   GROUP BY Team
   ORDER BY Count(*) DESC

Denne forespørgsel kan så joines til tabellen med navne:

   SELECT Holdnavn, ISNULL(Antal, 0) As Antal
   FROM TTeam t LEFT JOIN
   (
       SELECT Team, COUNT(*) AS Antal
       FROM (
           SELECT iTeam1 as Team
           FROM TReport
           UNION ALL
           SELECT iTeam2
           FROM TReport
       )
       GROUP BY Team
   ) as r
   ON t.id = r.Team
   ORDER BY Antal DESC

Det burde give dig det ønskede resultat. Jeg har brugt LEFT JOIN +
ISNULL til at få hold der ikke optræder i rapporttabellen med i
svaret - hvis man ikke ønsker det, er det bare at bruge INNER JOIN.
Ovenstående er lavet til MSSQL, men bortset fra ISNULL-funktionen
(der sikkert hedder noget andet i fx MySQL), burde det fungere hvis
din database bare understøtter subselects.

--
Jens Gyldenkærne Clausen
»Diplomatiet består netop i, at de gamle kommatister kan få lov til
at tro, at de har vundet. Men i virkeligheden har de tabt.«
Ole Togeby i Information

SpookiePower (16-11-2007)
Kommentar
Fra : SpookiePower


Dato : 16-11-07 11:14

Jens Gyldenkærne Clausen wrote:

<snip>

> Det burde give dig det ønskede resultat. Jeg har brugt LEFT JOIN +
> ISNULL til at få hold der ikke optræder i rapporttabellen med i
> svaret - hvis man ikke ønsker det, er det bare at bruge INNER JOIN.
> Ovenstående er lavet til MSSQL, men bortset fra ISNULL-funktionen
> (der sikkert hedder noget andet i fx MySQL), burde det fungere hvis
> din database bare understøtter subselects.

Mange tak for din grundige besvarelse, den vil jeg kigge nærmere på.
Om access understøtter subselects ved jeg ikke, men det finder jeg ud.


SpookiePower (16-11-2007)
Kommentar
Fra : SpookiePower


Dato : 16-11-07 11:49

Der er noget som jeg ikke kan få til at virke desværre.
Når jeg skal joine resultatet til sidst så jeg får navnene
på holdene med, så for jeg en besked om at der er fejl
i join'ingen. Jeg er lidt på bar bund desværre.

Syntax error in JOIN operation. (Error 3135)
You entered an SQL statement that has an invalid join operation. It
could be an inner join, outer join, or self-join.

Possible causes:

A reserved word or argument name is misspelled or missing.
Punctuation is incorrect.

Jens Gyldenkærne Cla~ (16-11-2007)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 16-11-07 14:22

SpookiePower skrev:

> Der er noget som jeg ikke kan få til at virke desværre.
> Når jeg skal joine resultatet til sidst så jeg får navnene
> på holdene med, så for jeg en besked om at der er fejl
> i join'ingen. Jeg er lidt på bar bund desværre.

Det er noget tid siden jeg har arbejdet med Access, men jeg mener
at huske at Access kræver eksplicit alias-angivelse - dvs. der skal
et AS ind her:

   FROM TTeam AS t LEFT JOIN


Jeg kan også se nu at der mangler alias på den inderste subselect:


   FROM (
           SELECT iTeam1 as Team
           FROM TReport
           UNION ALL
           SELECT iTeam2
           FROM TReport
       ) AS sub



Prøv at se om det bringer dig videre.


--
Jens Gyldenkærne Clausen
Svar venligst under det du citerer, og citer kun det der er
nødvendigt for at forstå dit svar i sammenhængen. Se hvorfor og
hvordan på http://usenet.dk/netikette/citatteknik.html

SpookiePower (19-11-2007)
Kommentar
Fra : SpookiePower


Dato : 19-11-07 16:22

Det så ud til at virke. Mange tak :)

Kristian Damm Jensen (16-11-2007)
Kommentar
Fra : Kristian Damm Jensen


Dato : 16-11-07 16:26

Jens Gyldenkærne Clausen wrote:
<snip>
> Ovenstående er lavet til MSSQL, men bortset fra ISNULL-funktionen
> (der sikkert hedder noget andet i fx MySQL), burde det fungere hvis
> din database bare understøtter subselects.

Bare til orientering: isnull er et specialtilfælde af standardfunktionen
coalesce. Jeg har endnu ikke hørt om databasesystemer der ikke i en eller
grad understøtter denne funktion.

--
Venlig hilsen /Best regards
Kristian Damm Jensen



Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408914
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste