Mysql优化,多选择单选

时间:2010-02-11 08:55:56

标签: php mysql query-optimization

我有表格,我需要选择期间总数的MAX(SUM(总计))。

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';

我已运行上述查询并在php中找到最高总数。

我不确定如何按此查询进行分组。

我期待单个查询将所有查询替换为MAX(SUM(总计))。

请帮帮我。

1 个答案:

答案 0 :(得分:3)

您可以尝试类似

的内容
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

或更短的版本

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