2010-11-16 69 views
1

Salut juste ne peux pas sembler construire la requête MYSQL Im après.Utilisation des instructions conditionnelles MYSQL et des variables dans une requête

Disons que j'ai un résultat de deux colonnes: 1) le nom du navigateur et 2) le nombre de navigateurs. Lorsque cela devient compliqué, je veux que 90% du nombre total soit atteint pour renommer tous les autres navigateurs et marquer le pourcentage restant en conséquence.

Je sais que je peux obtenir le nombre total comme une variable avant de commencer la déclaration principale:

SELECT @total := COUNT(id) FROM browser_table WHERE start LIKE "2010%"; 

Je peux ensuite grouper les résultats par navigateur:

SELECT browser, COUNT(id) AS visits 
FROM browser_table 
WHERE start LIKE "2010%" 
GROUP BY browser 

Je sais que je dois whack dans une déclaration de cas (et une variable de compteur) pour trier les colonnes, mais pas sûr de la façon d'implémenter le dans la requête ci-dessus:

CASE 
    WHEN counter >= 0.9* @total THEN 'other' 
    ELSE browser 
END AS browser; 

Espérons que cela a du sens? Merci pour votre temps ....

Répondre

0

est ici une approche ...

Vous pouvez calculer un total en cours d'exécution en fonction de this answer. Exemple:

SET @rt := 0; 
SELECT 
    browser, 
    visits, 
    (@rt := @rt + visits) AS running_total 
FROM 
    (
     SELECT 
      browser, 
      COUNT(id) AS visits 
     FROM 
      browser_table 
     WHERE 
      start LIKE '2010%' 
     GROUP BY 
      browser 
     ORDER BY 
      visits DESC 
    ) AS sq 
; 


Une fois que vous avez cela en place, vous pouvez construire sur cela pour créer une catégorie 'Autre':

SET @threshold := (SELECT COUNT(id) FROM browser_table WHERE start LIKE '2010%') * 0.90; 
SET @rt := 0; 
SELECT 
    browser, 
    SUM(visits) AS total_visits 
FROM 
    (
     SELECT 
      IF (@rt < @threshold, browser, 'Other') AS browser, 
      visits, 
      (@rt := @rt + visits) AS running_total 
     FROM 
      (
       SELECT 
        browser, 
        COUNT(id) AS visits 
       FROM 
        browser_table 
       WHERE 
        start LIKE '2010%' 
       GROUP BY 
        browser 
      ) AS sq1 
     ORDER BY 
      visits DESC 
    ) AS sq2 
GROUP BY 
    browser 
ORDER BY 
    total_visits DESC 
;