Mysql оптимизация, множественный выбор до одного выбора - PullRequest
0 голосов
/ 11 февраля 2010

У меня есть таблица, в которой мне нужно выбрать МАКС (СУММА (всего)) для общей суммы периодов.

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 Ответ

3 голосов
/ 11 февраля 2010

Вы можете попробовать что-то вроде

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
...