webForumDet fria alternativet

Problem med att "Räkna" i SQL

20 svar · 732 visningar · startad av saw

sawMedlem sedan mars 20011 883 inlägg
#1

JAg har en liten fin sql som i grunden fungerar bra;
[kod]
SELECT Count(Listan.Ratt) AS Antal, Listan.Ratt AS Rätt FROM Listan
GROUP BY Listan.Ratt ORDER BY Listan.Ratt DESC
[kod]
Jag får då ut ett resultat som ser ut så här:

10 = 1222
9 = 203
8 = 2200

Nu ville jag försöka att "få tag" på t ex alla som har tio rätt, och jag antar att
man bör göra det i sql:en och använda en psedonym.
Tacksam för förslag.
Jag vet att jag skulle kunna göra 10 st sql men målet är ju att kunna göra
detta i en sql.

jmeMedlem sedan maj 20011 967 inlägg
#2

...

Fredde MannenMedlem sedan nov. 20013 498 inlägg
#3

Hur ser tabellerna ut som du använder för att veta vilka som är "användare", samt tabellen för listan med antalet rätt, samt hur ser deras relation ut?

jmeMedlem sedan maj 20011 967 inlägg
sawMedlem sedan mars 20011 883 inlägg
#5

Detta är en tabell utan relationer(Access) och består av följande fällt
id
namn
svar1
svar2 osv till svar10
Ratt
Fel
Tid
Datum

Det jag vill göra är att grafiskt visa i procent hur manga som har svarat 1 rätt,
2 rätt osv.

Som jag nämnde inledningsvis så fungerar den sql:en men jag kan ju inte
hantera de enskikkda rätten(10, 9 osv).

überfuzzMedlem sedan apr. 2006434 inlägg
#6

Krångla inte till det så mycket. Gör en for-loop och query:a för varje antal rätt.

for ($i = 0; $i <= 10; $i++) {
    query = "SELECT COUNT(något) AS antal_personer_med_poäng FROM tabell WHERE antal_rätt = '".$i."'";
    //behandla queryn.

echo "Vi hade ".$query_result['antal_personer_med_poäng']." st som hade ".$i." poäng rätt.";
}

Utskriften och behandlingen av queryn är inte direkt klar, men det ger dig nog en idé om hur du kan lösa det. Tips, stoppa in resultatet i en array, så kan du jobba med den när du ska skriva ut listan.

Edit: rättade stavfel.

sawMedlem sedan mars 20011 883 inlägg
#7

Eftersom all databashantering sker via en web service, så tänkte jag att det skulle vara dumt med många databasanrop, annars så kunde jag ju göra tio stycken...

Jag funderade på en sql ung så här:

SELECT
(
SELECT Count(Listan.Ratt) AS Antal10, Listan.Ratt AS ten 
FROM Listan
GROUP BY Listan.Ratt
HAVING(Listan.Ratt)=10
)
,
(
SELECT Count(Listan.Ratt) AS Antal9, Listan.Ratt AS nine 
FROM Listan
GROUP BY Listan.Ratt
HAVING(Listan.Ratt)=9
)
,
(
SELECT Count(Listan.Ratt) AS Antal8, Listan.Ratt AS eight 
FROM Listan
GROUP BY Listan.Ratt
HAVING(Listan.Ratt)=8
)
,
(
SELECT Count(Listan.Ratt) AS Antal7, Listan.Ratt AS seven 
FROM Listan
GROUP BY Listan.Ratt
HAVING(Listan.Ratt)=7
)
,
(
SELECT Count(Listan.Ratt) AS Antal6, Listan.Ratt AS six 
FROM Listan
GROUP BY Listan.Ratt
HAVING(Listan.Ratt)=6
)
,
(
SELECT Count(Listan.Ratt) AS Antal5, Listan.Ratt AS five 
FROM Listan
GROUP BY Listan.Ratt
HAVING(Listan.Ratt)=5
)
,
(
SELECT Count(Listan.Ratt) AS Antal4, Listan.Ratt AS four 
FROM Listan
GROUP BY Listan.Ratt
HAVING(Listan.Ratt)=4
)
,
(
SELECT Count(Listan.Ratt) AS Antal3, Listan.Ratt AS tree 
FROM Listan
GROUP BY Listan.Ratt
HAVING(Listan.Ratt)=3
)
,
(
SELECT Count(Listan.Ratt) AS Antal2, Listan.Ratt AS two 
FROM Listan
GROUP BY Listan.Ratt
HAVING(Listan.Ratt)=2
)
,
(
SELECT Count(Listan.Ratt) AS Antal1, Listan.Ratt AS one 
FROM Listan
GROUP BY Listan.Ratt
HAVING(Listan.Ratt)=1
)
,
(
SELECT Count(Listan.Ratt) AS Antal0, Listan.Ratt AS zero 
FROM Listan
GROUP BY Listan.Ratt
HAVING(Listan.Ratt)=0
)
ORDER BY Listan.Ratt DESC;

Denna fungerar dock inte jag får syntaxfel operator saknas. Är jag ute och
cyklar?

*************************
När jag ser resultatet av mina ansträngningar så får det mig att fundera
mera på vad überfuzz skrev.

Peter SMedlem sedan dec. 20025 484 inlägg
#8

Med din första fråga får du ju ut hur många som har 1, 2, 3, o.s.v. rätt.

Nu vill du även ta reda på hur många som svarat rätt på respektive fråga? Då får du ställa en SQL-fråga per svar:

select count(*) from listan where svar1 = true
überfuzzMedlem sedan apr. 2006434 inlägg
#9

Peter S skrev:

select count(*) from listan where svar1 = true

Peter, den där true-grejen, jag förstår inte riktigt hur den fungerar? Måste han en binär typ på den (svar1 alltså)?

Vidare så kan jag inte så här på rak arm se hur man går från tex antal rätt på fråga ett bland alla tävlande till hur många som hade ett rätt när de tävlade.

Peter SMedlem sedan dec. 20025 484 inlägg
#10

überfuzz skrev:

Peter, den där true-grejen, jag förstår inte riktigt hur den fungerar? Måste han en binär typ på den (svar1 alltså)?

Vidare så kan jag inte så här på rak arm se hur man går från tex antal rätt på fråga ett bland alla tävlande till hur många som hade ett rätt när de tävlade.

Jag utgick från att han sparar huruvida svaret är rätt eller inte i svarX. Det kan givetvis visa sig vara ett felaktigt antagande eftersom varken fältbeskrivning eller exempel på tabellinnehåll givits.

Om ovanstående visar sig vara ett korrekt antagande får man ju, genom att räkna alla med svar1 = true, reda på hur många som har svarat rätt på den första frågan. Hur många som totalt har 1 rätt verkar man få genom att gruppera på Ratt och utföra en count.

sawMedlem sedan mars 20011 883 inlägg
#11

För att specifera lite mera så är det i fältet Ratt som jag har räknat hur många
rätt respektive tävlande har. I de andra fälten så har jag sparat svaren.
I dag så kanske jag tycker att denna tabellen bara behövde vara id, namn, antal_Ratt,
tid och datum, men gjort är gjort.

Peter SMedlem sedan dec. 20025 484 inlägg
#12

Hur vet man om värdet i svarX är rätt?

sawMedlem sedan mars 20011 883 inlägg
#13

Innan jag sparar i databasen så har jag kollat det och sedan så sammanfattar jag alla
svaren i Rätt.
Frågesporten ligger på https://www.saw.se under aktivitet/musikfrågan.

Peter SMedlem sedan dec. 20025 484 inlägg
#14

Ja, då blir det kanske svårt att veta hur många som svarat rätt på varje fråga. Såvida du inte byter ut "true" mot något annat, statiskt värde.

sawMedlem sedan mars 20011 883 inlägg
#15

Min sql fungerar ju och jag kan koppla den mot en gridview, men jag ville leka lite själv
med den

SELECT Count(Listan.Ratt) AS Antal, Listan.Ratt AS Rätt FROM Listan 
GROUP BY Listan.Ratt ORDER BY Listan.Ratt DESC

Här ser du att jag använder listan.Ratt och sedan gruppera.

Peter SMedlem sedan dec. 20025 484 inlägg
#16

Ja, och då får du ut hur många som haft 1, 2, 3, o.s.v. rätt.

Vad var frågan? :P

sawMedlem sedan mars 20011 883 inlägg
#17

Jo vad jag skulle vilja är att "få tag" på t ex alla som har 10 rätt och sne nästa på 9
rätt osv för att kunna göra ett stapeldiagram.

Peter SMedlem sedan dec. 20025 484 inlägg
#18

Alla som har 10 rätt:

select * from listan where ratt = 10

...eller allihop:

select * from listan order by ratt desc
jmeMedlem sedan maj 20011 967 inlägg
#19

Jag skulle iaf inte köra med åäö i aliaser...

sawMedlem sedan mars 20011 883 inlägg
#20

nja det är ju inte så lätt, då måste jag köra 10 sql:er, och det tänkte jag försöka att undvika.

Genererad på 366 ms · cache AV · v20260730165559-full.f96bc7eb