|
| 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
| |
|
|