2016-08-10 2 views
0

Я не уверен, что такое имя, которое нужно дать этому условию в предложении where. Я использую Microsoft SQL Server 2008.Добавить условие в предложение where

В принципе, у меня есть таблица заказов со следующими столбцами.

MyOrderTable:

OrderAmount Paid OrderDate 
100   Y  2016-08-10 21:15:52.000 
120   N  2016-08-10 20:15:12.000 
300   Y  2016-08-09 11:10:22.000 
500   Y  2016-06-09 10:10:54.000 
125   N  2016-06-09 09:15:13.000 
325   N  2015-11-09 09:15:13.000 

В настоящее время я следующий SQL-запрос:

SELECT DATEPART(Year, OrderDate) TheYear, DATEPART(Month, OrderDate) TheMonth, 
     SUM(ISNULL(OrderAmount, 0)) as SumOrderAmount 
FROM MyOrderTable 
WHERE YEAR(OrderDate) = 2016 
GROUP BY DATEPART(Year, OrderDate), DATEPART(Month, OrderDate) 
ORDER BY TheYear, TheMonth 

результат, возвращаемый из приведенного выше SQL, как следующее:

TheYear  TheMonth SumOrderAmount 
2016  6   625 
2016  8   520 

Как Я также запрашиваю SumOrderAmount, где строка Paid = 'Y'? Я хочу вернуть из SQL следующие данные:

TheYear  TheMonth SumOrderAmount PaidSumOrderAmount 
2016  6   625    500 
2016  8   520    400 

Как я могу это сделать? Любая помощь приветствуется. Спасибо.

ответ

1

Использование условной агрегации:

SELECT DATEPART(Year, OrderDate) TheYear, DATEPART(Month, OrderDate) TheMonth, 
     SUM(ISNULL(OrderAmount, 0)) as SumOrderAmount, 
     SUM(CASE WHEN Paid = 'Y' THEN OrderAmount ELSE 0 END) as PaidOrderAmount 
FROM MyOrderTable 
WHERE YEAR(OrderDate) = 2016 
GROUP BY DATEPART(Year, OrderDate), DATEPART(Month, OrderDate) 
ORDER BY TheYear, TheMonth; 

Вы, наверное, не нужно ISNULL() в SUM(). В SQL значения NULL игнорируются в функции агрегации SUM().

+1

Так после того, как говорится, он не нуждается в 'ELSE 0' тоже :) – sagi

+1

@sagi. , , Au contraire. Это необходимо для предотвращения значений «NULL», когда совпадений нет, поскольку разумно предположить, что месяц не будет иметь оплаченных сумм. С другой стороны, если все платные суммы за месяц были «NULL», тогда это было бы необходимо и для общего. Это представляется маловероятным с учетом предоставленных данных. –

+1

Если у OP есть месяцы без платных продаж, это, вероятно, большая проблема, чем значение NULL вместо 0. – jarlh

1

Используйте выражение case сделать условный SUM():

SELECT DATEPART(Year, OrderDate) TheYear, DATEPART(Month, OrderDate) TheMonth, 
     SUM(ISNULL(OrderAmount, 0)) as SumOrderAmount, 
     SUM(case when Paid='Y' then OrderAmount end) 
FROM MyOrderTable 
WHERE YEAR(OrderDate) = 2016 
GROUP BY DATEPART(Year, OrderDate), DATEPART(Month, OrderDate) 
ORDER BY TheYear, TheMonth 
0

Добавить эту статью на выбор:

SUM(CASE WHEN Paid='Y' THEN OrderAmount ELSE 0 END) AS PaidSumOrderAmount 
0
SELECT DATEPART(Year, OrderDate) TheYear, DATEPART(Month, OrderDate) TheMonth, 
     SUM(ISNULL(OrderAmount, 0)) as SumOrderAmount,Paid 
FROM MyOrderTable 
WHERE (YEAR(OrderDate) = 2016) and (Paid = 'Y') 
GROUP BY DATEPART(Year, OrderDate), DATEPART(Month, OrderDate) 
ORDER BY TheYear, TheMonth 
+0

Обратите внимание, что OP хочет сохранить столбец SumOrderAmount, как и раньше. – jarlh

+0

@jarlh извините, я понимаю, что хорошо знаю английскую версию –

+0

@jarlh ваш ответ и Gordon Linoff тот же –

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