2010-02-11 4 views
0

J'ai une table où j'ai besoin de sélectionner MAX (SOMME (total)) d'un total de périodes.Optimisation mysql, sélectionner multiple pour sélectionner simple

SELECT SUM(P.amount) as total FROM bank P WHERE P.ReceivedDate >= '2008-07-28' AND P.ReceivedDate <= '2008-08-31'; 

SELECT SUM(P.amount) as total FROM bank P WHERE P.ReceivedDate >= '2008-09-01' AND P.ReceivedDate <= '2008-09-28'; 

SELECT SUM(P.amount) as total FROM bank P WHERE P.ReceivedDate >= '2008-09-29' AND P.ReceivedDate <= '2008-10-26'; 

J'ai exécuté les requêtes ci-dessus et trouvé le total le plus élevé en PHP.

Je ne sais pas comment regrouper par cette requête.

Je m'attends à une seule requête pour remplacer toute cette requête à MAX (SUM (total)).

aidez-moi s'il vous plaît.

Répondre

3

Vous pouvez essayer quelque chose comme

SELECT TOP 1 
     CASE 
      WHEN P.ReceivedDate BETWEEN '2008-07-28' AND '2008-08-31' THEN 1 
      WHEN P.ReceivedDate BETWEEN '2008-09-01' AND '2008-09-28' THEN 2 
      WHEN P.ReceivedDate BETWEEN '2008-09-29' AND '2008-10-26' THEN 3 
     END, 
     SUM(P.amount) Total 
FROM bank p 
GROUP BY CASE 
      WHEN P.ReceivedDate BETWEEN '2008-07-28' AND '2008-08-31' THEN 1 
      WHEN P.ReceivedDate BETWEEN '2008-09-01' AND '2008-09-28' THEN 2 
      WHEN P.ReceivedDate BETWEEN '2008-09-29' AND '2008-10-26' THEN 3 
     END 

HAVING CASE 
      WHEN P.ReceivedDate BETWEEN '2008-07-28' AND '2008-08-31' THEN 1 
      WHEN P.ReceivedDate BETWEEN '2008-09-01' AND '2008-09-28' THEN 2 
      WHEN P.ReceivedDate BETWEEN '2008-09-29' AND '2008-10-26' THEN 3 
     END IS NOT NULL 
ORDER BY Total DESC 

ou une version plus courte

SELECT TOP 1 
     SUM(amount) Total 
FROM (
      SELECT CASE 
         WHEN P.ReceivedDate BETWEEN '2008-07-28' AND '2008-08-31' THEN 1 
         WHEN P.ReceivedDate BETWEEN '2008-09-01' AND '2008-09-28' THEN 2 
         WHEN P.ReceivedDate BETWEEN '2008-09-29' AND '2008-10-26' THEN 3 
        END GroupVal, 
        P.amount 
      FROM bank P 
     ) Vals 
GROUP BY Vals.GroupVal 
HAVING Vals.GroupVal IS NOT NULL 
ORDER BY Total DESC 
+0

Pourquoi ne pas utiliser entre au lieu de> = <= opérateurs? – AntonioCS

+0

Vrai, entre serait mieux. –

+0

oui je vais utiliser entre, merci pour votre solution – itsoft3g