2016-05-27 12 views
2

Ich habe ein einfaches Abstimmungssystem, das Stimmen sammelt. Die Tabellierung sollte insgesamt Ja-Stimmen dividiert durch Gesamtstimmen umfassen, um zu bestimmen, ob eine Zweidrittelmehrheit erreicht ist. Derzeit kann ich die Daten zurückgeben, diese Abfrage mitmysql Prozentsatz in Select berechnen

select sum(case when vote is not null and recruit_id=49631 then 1 else 0 end) 
as total_votes, 
sum(case when vote=1 and recruit_id=49631 then 1 else 0 end) as total_yes from votes; 

diese zurück

+-------------+-----------+ 
| total_votes | total_yes | 
+-------------+-----------+ 
|   3 |   2 | 
+-------------+-----------+ 

was würde Ich mag etwas zu tun ist, wie diese

+-------------+-----------+-----------+ 
| total_votes | total_yes | YESPercent| 
+-------------+-----------+-----------+ 
|   3 |   2 |  66.6 | 
+-------------+-----------+-----------+ 

ich mit so etwas versucht, wie dies:

select sum(case when vote is not null and recruit_id=49631 then 1 else 0 end) as total_votes, 
sum(case when vote=1 and recruit_id=49631 then 1 else 0 end) as total_yes, 
sum(total_votes,total_yes,(total_yes/total_votes)*100) as YESPercent from votes; 

Es erkennt nicht die total_yes oder total_votes für den letzten Teil .. Irgendwelche Tipps oder Links zu guter Anleitung?

Antwort

2

Der sauberste Weg, dies zu tun, IMHO, wäre es, die grundlegenden Ergebnisse in einer Unterabfrage zu haben und berechnen sie in der äußeren Abfrage verwenden. Beachten Sie, dass diese Bedingung nur in recruit_id = 49631 in beiden Spalten angezeigt werden kann und in die where-Klausel verschoben werden kann. Es wird auch, wahrscheinlich, leicht die Leistung der Abfrage verbessern. Als eine weitere Verbesserung, könnten Sie die mehr geradeaus count statt sum, indem es seine Qualität des Überspringens null s verwenden:

SELECT total_votes, total_yes, total_yes * 100/total_votes AS yes_percent 
FROM (SELECT COUNT(vote) AS total_votes, 
       COUNT(CASE WHEN vote = 1 THEN 1 END) as total_yes, 
     FROM votes 
     WHERE recruit_id = 49631) t 
+0

Einfügen dieses direkt in den Ergebnissen in ' 'FROM Stimmen WHERE recruit_id = 49631) t'' ich es geändert haben als t; als das Ende mit dem gleichen Ergebnis. Ich spiele immer noch mit dem Code und versuche herauszufinden, was los ist. Vielen Dank für den Tipp auf Nullen zu ignorieren, indem Sie zählen, es hat definitiv meine Abfrage Zeit beschleunigt! – driz

+0

ich habe es funktioniert, indem ich dies tun, ich muss einige weitere Daten in die Tabelle hinzufügen, um sicherzustellen, dass es funktioniert wie erwartet, aber danke! 'select sum (total_yes * 100/total_votes) als Yes_Percent von (zähle count (vote) als total_votes, count (fall bei vote = 1 dann 1 end) als total_yes von votes wo recruit_id = 49631) als t;' – driz

1

Grundsätzlich müssen Sie nur Ihre ursprüngliche Abfrage eine Unterabfrage machen, dies zu erreichen:

SELECT total_votes, total_yes, sum(total_votes,total_yes,(total_yes/total_votes)*100) as YESPercent 
FROM 
(select 
sum(case when vote is not null and recruit_id=49631 then 1 else 0 end) as total_votes, 
sum(case when vote=1 and recruit_id=49631 then 1 else 0 end) as total_yes 
from votes) as v; 
1

leicht auf dem SQL-Dialekt abhängig, kann Aliase wiederverwendet wird oder nicht. In MySQL sind Sie darauf beschränkt. Die Lösung ist eine Unterabfrage:

SELECT total_votes,total_yes,sum(total_votes,total_yes, 
(total_yes/total_votes)*100) as YESPercent 
FROM (
    select sum(case when vote is not null and recruit_id=49631 then 1 else 0 end) as total_votes, 
    sum(case when vote=1 and recruit_id=49631 then 1 else 0 end) as total_yes, 
    sum(total_votes,total_yes,(total_yes/total_votes)*100) as YESPercent 
    from votes) a; 
Verwandte Themen