Jun 062010
 

Flattr this!

Ibland kan det vara intressant att få fram lite statistik från en databas, kanske räkna summan av flera poster, göra uträkningar av olika slag. I mitt exempel utgår jag från exemplet med filmdatabasen som jag visade här.

Jag vill räkna hur många olika genrer varje film har.

Ett formulär är inte nödvändigt för denna uppgift men kan underlätta för att knappa in uppgifter i databasen. I så fall kan denna också behövas.

Jag valde att knappa in en hel del data i min filmdatabas för att få lite utslag:

Dessutom med genre som passar dessa filmer:

I filmen Den gode, den onde, den fule som bilden ovan visar valde jag att sätta tre olika genrer på för att få lite bättre resultat i slutändan.

När allting är klart så vill vi räkna ut hur många genrer varje film har.

I huvudfönstret väljer vi ”Sökningar” till vänster och sen ”Skapa sökning i SQL-vy”.

Där skriver vi in följande:

eller klistra in följande:

SELECT ”Filmtabell”.”Filmnamn”, COUNT(”Genretabell”.”Genre”) FROM ”FilmGenre”, ”Filmtabell”, ”Genretabell”
WHERE ”FilmGenre”.”FilmID” = ”Filmtabell”.”FilmID” AND ”FilmGenre”.”GenreID” = ”Genretabell”.”GenreID”
GROUP BY ”Filmtabell”.”Filmnamn”

och när vi väljer kör så får vi detta resultat:

I resultatet så har vi först Die Hard där det står en 2:a, alltså action och komedi. En 3:a på den gode, den onde, den fule som står för västern, komedi och action, alltså 3 stycken.

Här är förklaringen till vårt sql-kommando:

SELECT ”Filmtabell”.”Filmnamn”,

Vi vill få fram filmnamnen i sökningen och som ni kan notera så har jag tabellnamn.fältnamn. Detta är ett måste då vi rotar i flera tabeller i samma fråga. Två tabeller kan nämligen ha fältnamn som är samma och detta skiljer dessa åt.

COUNT(”Genretabell”.”Genre”)

Vi vill ha en uträkning baserat på fältet genrer i tabellen Genretabell.

FROM ”FilmGenre”, ”Filmtabell”, ”Genretabell”

Tabellerna som används i frågan deklareras. I detta fallet är det samtliga tre som används.

WHERE ”FilmGenre”.”FilmID” = ”Filmtabell”.”FilmID” AND ”FilmGenre”.”GenreID” = ”Genretabell”.”GenreID”

Vi kopplar Filmgenre med respektive i Filmtabell och Genretabell. Detta måste göras för att kunna utnyttja alla tabeller.

GROUP BY ”Filmtabell”.”Filmnamn”

Eftersom vi håller på med en gruppfunktion så behövs GROUP BY.

Nu vill vi ha listan sorterad. Jag skulle vilja ha listan sorterad på detta viset:

alltså med högsta numret överst och sen fallande. Som jag visade i sql-skolan del 1 så kan man köra med ORDER BY Filmtabell.Filmnamn om man vill ha listan sorterad efter film. Det är bara att skriva denna rad under GROUP BY-raden.

Nu vill vi att uträkningen ska sorteras och då är det COUNT(”Genretabell”.”Genre”). Detta går inte genom att skriva ORDER BY COUNT(”Genretabell”.”Genre”) utan vi måste fixa ett alias.

COUNT(”Genretabell”.”Genre”) AS räkna

Nu motsvarar ”räkna” hela den långa raden. Därefter är det bara att skriva detta under GROUP BY-raden:

ORDER BY räkna DESC

Desc för att vi vill ha fallande sortering.

Därför blir den kompletta frågan så här:

SELECT ”Filmtabell”.”Filmnamn”, COUNT(”Genretabell”.”Genre”) AS räkna FROM ”FilmGenre”, ”Filmtabell”, ”Genretabell”
WHERE ”FilmGenre”.”FilmID” = ”Filmtabell”.”FilmID” AND ”FilmGenre”.”GenreID” = ”Genretabell”.”GenreID”
GROUP BY ”Filmtabell”.”Filmnamn”
ORDER BY räkna DESC

Jag kommer att fortsätta med statistik i senare bloggar. I denna har jag valt COUNT (räkna) men det finns även summa, medelvärde och annat smått och gott.

Kommentera

%d bloggare gillar detta: