it-swarm.com.de

Zählen Sie Zeilen mit einer bestimmten Bedingung in der Aggregatabfrage

Ich habe diese Abfrage, um die Anzahl von PlayerSessions mit reconnect = TRUE zu erhalten, gruppiert nach Player.country:

SELECT
    country,
    COUNT(*) AS with_reconnect
FROM PlayerSession S LEFT JOIN Player P ON (P.id = S.player_id)
WHERE reconnect = TRUE
GROUP BY country

Ich möchte es so ändern, dass nicht nur die Anzahl der wiederhergestellten Sitzungen angezeigt wird, sondern auch die Gesamtanzahl.

SELECT
    country,
    COUNT(*) AS total,
    (COUNT WHERE reconnect = TRUE) AS with_reconnect
FROM PlayerSession S LEFT JOIN Player P ON (P.id = S.player_id)
GROUP BY country

Ist das möglich und wenn ja, wie lautet die richtige Syntax?

25
SELECT  Country,
        COUNT(*) AS Total,
        COUNT(CASE WHEN Reconnect = true THEN 1 END) AS With_Reconnect
FROM    PlayerSession S 
        LEFT JOIN Player P 
            ON P.id = S.player_id
GROUP BY country
57
GarethD

Folgendes wird ausreichen

SELECT
    p.country,
    COUNT(*) AS total,
    SUM(IF(s.reconnect=TRUE,1,0)) AS with_reconnect
FROM PlayerSession s

INNER JOIN Player p
ON p.id = s.player_id

GROUP BY p.country

Ich habe gerade die Abfrage neu geschrieben. Für jede PlayerSession gibt es immer eine Player-Zeile, daher wurde sie zu INNER JOIN. Die CONCAT wurde auch nicht benötigt, da in dieser Abfrage immer PlayerSession-Zeilen vorhanden sind (es sei denn, es sind keine Sitzungen vorhanden).

18
SELECT
    country,
    COUNT(CASE WHEN reconnect = TRUE THEN S.player_id ELSE NULL END) AS with_reconnect,
    COUNY(*)
FROM PlayerSession S LEFT JOIN Player P ON (P.id = S.player_id) 
GROUP BY country
1
Lamak
SELECT
    country,
    COUNT(*) AS total,
    sum(case when reconnect = TRUE then 1 else 0 end)  AS with_reconnect
FROM PlayerSession S LEFT JOIN Player P ON (P.id = S.player_id)
GROUP BY country
0
Vikram