2010-10-05 2 views
1

Я хотел бы получить сумму из столбца с условием и без него. Код, который у меня есть сейчас:оптимизация агрегатов с условием и без условия в ms sql

SELECT regular.id, regular.sum as regularsum, special.sum as specialsum FROM 
(SELECT Sum(stuff) as sum, id FROM table 
WHERE commonCondition = true 
GROUP BY id) as regular 
INNER JOIN 
(SELECT Sum(stuff) as sum, id FROM table 
Where commonCondition = true AND specialCondition = true 
GROUP BY id) as special 
ON regular.id = special.id 

Что работает, но кажется очень неэффективным, не говоря уже о некрасивом. таблица довольно большая, поэтому некоторые оптимизации будут приветствоваться.

Как я могу написать это более эффективным, более эффективным способом?

+0

У вас есть какие-либо указатели на столе? – Thakur

+0

Существует индекс на id и на specialCondition – Martijn

ответ

2

Я думаю, что вы могли бы сделать что-то вроде этого:

SELECT 
    Sum(stuff) as regularsum, 
    sum(case when specialcondition=true then stuff else 0 end) as specialsum, 
    id FROM table 
WHERE commonCondition = true 
GROUP BY id 

Однако, вы хотите, чтобы проверить, чтобы увидеть, если это было быстрее.

+0

Время исполнения сократилось с 98783 до 58631 миллисекунды, не говоря уже об этом намного более аккуратный код. Благодаря! – Martijn

+0

Просто для записей, хотя это утверждение является тем, что я имел в виду, эти два утверждения не идентичны: этот оператор включает строки, где specialcondition = false для всех случаев, а исходный оператор doesnt. Левый внешний Присоединиться к isnull (specialSum, 0) в оригинале сделает их идентичными – Martijn

Смежные вопросы