Вычитание 2 значений из запроса и подзапроса с использованием CROSS JOIN в SQL

У меня есть вопрос, на который я затрудняюсь ответить.

Узнайте, какова разница в количестве счетов-фактур и общем количестве продуктов, на которые выставлен счет, в период с мая по июнь.

Один из способов сделать это — использовать подзапросы: один для июня, а другой — для мая, и вычитать результаты двух запросов. Поскольку каждый из двух подзапросов будет возвращать одну строку, вы можете (должны) использовать CROSS JOIN, для которого не требуется предложение «on», поскольку вы соединяете «все» строки из одной таблицы (т. е. подзапрос) ко всем строкам из другого. Чтобы найти месяц определенной даты, вы можете использовать функцию МЕСЯЦ.

Вот документ Эрвина

введите здесь описание изображения

Это то, что я получил до сих пор. Я понятия не имею, как использовать CROSS JOIN в этой ситуации.

select COUNT(*) TotalInv, SUM(ILP.ProductCount) TotalInvoicedProducts
from Invoice I, (select Count(distinct ProductId) ProductCount from InvoiceLine) AS ILP 
where MONTH(inv_date) = 5

select COUNT(*) TotalInv, SUM(ILP.ProductCount) TotalInvoicedProducts
from Invoice I, (select Count(distinct ProductId) ProductCount from InvoiceLine) AS ILP 
where MONTH(inv_date) = 6

Если вы, ребята, можете помочь, это было бы здорово.

Спасибо


person fixnode    schedule 29.11.2013    source источник
comment
Какую СУБД вы используете? Оракул? Постгрес?   -  person a_horse_with_no_name    schedule 30.11.2013


Ответы (2)


Постановка проблемы предлагает вам выполнить следующие шаги:

  • Создайте запрос с единственной строкой результата, содержащей значения для июня.
  • Создайте запрос с единственной строкой результата, дающей значения для мая.
  • Сравните результаты двух запросов.

Проблема в том, что в SQL сделать третий шаг не так просто. Один из способов сделать это — выполнить перекрестное соединение, которое дает строку, содержащую все значения из обоих подзапросов; тогда легко использовать SELECT (b - a) ..., чтобы получить различия, которые вы ищете. Это не единственный способ сделать третий шаг, но то, что у вас есть, определенно не работает.

person Jose Torres    schedule 29.11.2013
comment
Я отредактировал свой код с двумя таблицами, которые необходимо перекрестно соединить. Ваша логика верна, и я хотел бы знать правильный синтаксис для CROSS JOIN - person fixnode; 30.11.2013

вы не можете что-то сделать с подзапросами? Я не проверял это, но что-то вроде приведенного ниже должно дать вам 4 столбца, счета и продукты за май и июнь.

select (

select 'stuff' a, count(*) as june_invoices, sum(products) as products from invoices 
where month = 'june' 
 ) june , (

select 'stuff' a, count(*) as may_invoices, sum(products) as products from invoices 
where month = 'may' 
) may

where june.a = may.a
person phatmanace    schedule 29.11.2013