Нахождение разницы (вычитания) в SQL

Я пытаюсь найти разницу в продажах футболок за 2013 и 2014 годы. Эти два запроса сами по себе дают мне правильное количество продаж. Однако я не знаю, как сравнить эти два числа и вернуть их разницу. Любая помощь?

select sum(qty)
from customers natural join orders
natural join itemsordered
natural join items
where orderdate >= '2014-01-01' and orderdate <= '2014-12-31' and description ='tshirt';

select sum(qty)
from customers natural join orders
natural join itemsordered
natural join items
where orderdate >= '2013-01-01' and orderdate <= '2013-12-31' and description ='tshirt';

Используемая база данных выглядит следующим образом:

Клиенты (custID, имя, firstOrderDate, город)

Менеджеры(mgrID, имя, зарплата)
Магазины(storeID, город, mgrID)
Товары(itemID, описание, размер, цвет)
Инвентарь(storeID, itemID, количество)
Заказы(orderID, orderDate, custID)
ItemsOrdered(itemID, orderID, qty)


person sakau2007    schedule 13.07.2014    source источник
comment
Какую базу данных вы используете? И чтобы было ясно, вы хотите изменить общее количество товаров за год? Итак, из запроса возвращается только одно число, да?   -  person Beel    schedule 13.07.2014
comment
Верно, возвращаемое значение должно быть целым числом. Однако всегда должно быть положительное целое число, независимо от того, выросли ли продажи на 500 или снизились на 500 за год, должно быть возвращено 500 (не -500). Я обновил исходный пост, чтобы показать информацию о базе данных.   -  person sakau2007    schedule 13.07.2014
comment
Получил часть абсолютного значения для работы. Спасибо, эта проблема полностью решена.   -  person sakau2007    schedule 13.07.2014


Ответы (2)


Вы используете выражение case внутри функции SUM(). Здесь вы фильтруете все записи только за интересующие вас 2 года, затем используете регистр, суммируете записи 2013 года, суммируете записи 2014 года, а затем вычитаете одну из них из другой. Как это:

select
      sum(case when orderdate >= '2013-01-01' and orderdate < '2014-01-01' then qty end) yr2013
    , sum(case when orderdate >= '2014-01-01' and orderdate < '2015-01-01' then qty end) yr2014

    , sum(case when orderdate >= '2014-01-01' and orderdate < '2015-01-01' then qty end)
    - sum(case when orderdate >= '2013-01-01' and orderdate < '2014-01-01' then qty end) diff

from customers 
natural join orders
natural join itemsordered
natural join items
where orderdate >= '2013-01-01' and orderdate < '2015-01-01' and description ='tshirt';

Обратите внимание на небольшое изменение, которое я внес в логику диапазона дат. Использование комбинации «больше и равно» с «меньше, чем (на следующий день)» более надежно, чем использование «равно» как в нижней, так и в верхней границах. (& Это работает для любой точности даты/времени, не вызывая пробелов или перекрытий.)

примечание: приведенное выше должно быть достаточно общим, но метод обработки дат будет различаться в зависимости от типа базы данных (который был неизвестен при написании)

person Paul Maxwell    schedule 13.07.2014
comment
Это работает. Однако я пытаюсь просто вернуть положительное целое число, и в моей базе данных я получаю -86. Я попытался добавить abs(), но столкнулся с ошибкой. - person sakau2007; 13.07.2014

Другим способом было бы свести строки за два года в одну строку и выполнить diff.

select diff = abs(y13_qty - y14_qty) from
(select yr = year(orderdate), qty
from customers natural join orders
natural join itemsordered
natural join items
where year(orderdate) in (2013,2014) and description ='tshirt')
pivot (sum(qty) as qty for yr in (2013 as 'y13', 2014 as 'y14'))

(не знаком с оракулом, поэтому синтаксис сводки может быть отключен)

person dotjoe    schedule 13.07.2014