2015-03-12 1 views
0

cette requête fonctionne mais tire tous les résultats. Je voudrais qu'il tire seulement des résultats qui ne sont pas 0,00 qui est le total. Ceci est calculé dans la requête mais je ne sais pas comment exclure les résultats avec 0.00?MYSQL sélectionner info de la somme dans la requête

SELECT name, 
SUM(IF(timeperiod='0',totalinv-paidtotal,0)) AS p0030, 
SUM(IF(timeperiod='30',totalinv-paidtotal,0)) AS p3060, 
SUM(IF(timeperiod='60',totalinv-paidtotal,0)) AS p6090, 
SUM(IF(timeperiod='90',totalinv-paidtotal,0)) AS p9000, 
SUM(totalinv)-SUM(paidtotal) AS totaldue 
FROM 
(
    SELECT primary_key, name, timeperiod, totalinv, SUM(paidtotal) as paidtotal 
    FROM 
    (
     SELECT 
      a.primary_key, 
      a_name AS name, 
      CAST(totalinv AS DECIMAL(10,2)) as totalinv, 
      CAST(IFNULL(amount,0) AS DECIMAL(10,2)) as paidtotal, 
      CASE 
       WHEN invoicedate > DATE_SUB(STR_TO_DATE($today,'%Y%m%d'),INTERVAL 29 DAY) THEN '0' 
       WHEN invoicedate > DATE_SUB(STR_TO_DATE($today,'%Y%m%d'),INTERVAL 59 DAY) AND invoicedate <= DATE_SUB(STR_TO_DATE($today,'%Y%m%d'),INTERVAL 29 DAY) THEN '30' 
       WHEN invoicedate > DATE_SUB(STR_TO_DATE($today,'%Y%m%d'),INTERVAL 89 DAY) AND invoicedate <= DATE_SUB(STR_TO_DATE($today,'%Y%m%d'),INTERVAL 29 DAY) THEN '60' 
       ELSE '90' 
      END AS timeperiod 
     FROM $mysql_billing a 
     LEFT OUTER JOIN $mysql_billing_dates b ON a.primary_key = b.id 
     WHERE $today >= invoicedate 
     AND $totaldue!='0.00' 
     AND void='' 
    ) foo 
    GROUP BY primary_key, name, timeperiod 
) bar 
GROUP BY name 
ORDER BY name ASC 
+0

En quoi consiste le '$ totaldue'? Est-ce une variable PHP de l'extérieur de cette chaîne? Quelle colonne (dans le tableau!) Est liée à totaldue? À l'heure actuelle, tant que cette variable externe est non nulle, tous les enregistrements seront retournés et si cette variable externe est nulle, aucun enregistrement ne sera retourné. –

+0

Incidemment, je suis sûr que tout cela peut être fait sans une seule sous-requête. Apprenez à utiliser 'JOIN 'plutôt que sous-requête - c'est beaucoup plus efficace en termes de performances et de lecture. –

+0

Comment pouvez-vous sélectionner totalinv sans fonction agrégée et groupe par tout sauf cela? Quelle valeur peut-elle donner ?! Je suis assez sûr qu'il doit être SELECT clé primaire, nom, timeperiod, SUM (totalinv), ... ' –

Répondre

0

Vous manque seulement un HAVING à la fin:

.... 
GROUP BY name 
HAVING totaldue != 0 
ORDER BY name ASC 

qui vous permettra de sélectionner sur votre calculée/colonne groupée.

+0

cela a fait ce que j'ai demandé, merci. Je suppose que je vais devoir comprendre comment faire cela afin qu'il ne tarde pas mysql – Shawn