alternative
===========
id | question_id | alternative
answer
===========
id | alternative_id
form
===========
id | form
question
===========
id | form_id | question
Det här är ett slags polldatabas, där svaren läggs i answer och är relaterade till alternative, som i sin tur är relaterad till question, och question till form.
Alltså, för att göra det lite enklare, ger jag följande exempel:
Formulär
id = 1 - form = Formulär 1
id = 2 - form = Formulär 2
Frågor
id = 1 - form_id = 1 (Denna fråga hör till formulär 1) - question = Är månen blå?
id = 2 - form_id = 1 (Denna fråga hör till formulär 1) - question = Vilken är din favoritfärg?
id = 3 - form_id = 2 (Denna fråga hör till formulär 2) - question = Hur mycket väger solsystemet?
Alternativ
id = 1 - question_id = 1 (Detta alternativ hör till fråga 1) - alternative = Ja
id = 2 - question_id = 1 (Detta alternativ hör till fråga 1) - alternative = Nej
id = 3 - question_id = 2 (Detta alternativ hör till fråga 2) - alternative = Blå
id = 4 - question_id = 2 (Detta alternativ hör till fråga 2) - alternative = Grön
id = 5 - question_id = 3 (Detta alternativ hör till fråga 3) - alternative = > 1kg
id = 6 - question_id = 3 (Detta alternativ hör till fråga 3) - alternative = < 1kg
Answer (Det som användaren svarar läggs in här)
id = 1 - alternative_id = 2 (Den här användaren svarade Nej på fråga 1)
id = 2 - alternative_id = 3 (Den här användaren svarade Blå på fråga 2)
Osv....
Jag har en hemsida på http://www.spelprojektet.tk/, och en av funktionerna till den här sidan skulle vara att skriva ut all statistik för svaren. Detta har visat sig mycket mycket svårare än jag trodde.
Den statistik jag vill skriva ut är hur många procent av varje alternativ som svarats på varje fråga. Rent principiellt är det fruktansvärt enkelt - svaren för varje alternativ delat med mängden av alla svar för just den frågan (dvs svar som har ett alternativ_id som finns under en viss question). Hur ska jag gå tillväga med det här?
Det enda jag lyckts göra hittils är detta:
SELECT alternative.question_id, count(alternative)
FROM alternative
INNER JOIN answer
ON alternative.id = answer.alternative_id
GROUP BY alternative
ORDER BY alternative.id
(Väljer hur många som svarat på varje alternativ, typ.)
Den fråga som du har skrivit ser väldig konstig ut i mina öron.
Normalt så grupperar man på de kolumner som inte ingår i någon aggregatfunktion. Sen så gör du order by på en kolumn som inte finns med i resultatet vilket blir väldigt obestämbart när man har group by. Om jag vore en databashanterare så skulle jag returnera flera semantiska fel för den frågan
select q.question,
a.alternativ,
100.0*cast(count(aw.id) as decimal(11,2))/
(select count(*)
from answer
where id = q.id) as percentage
from question as q
join alternative as a on q.id = a.question_id
left join answer as aw on aw.id = q.id and aw.alternative_id = a.id
group by q.question,
a.alternativ