2 Количество в 1 кв.

ProductTable

ProductID ProductDesc
401 Hotdog
402 Ham
403 Bacon

OrderTable

OrderID OrderPayment NumOrder OrderDate
5001 Cash 3 9-15-2013
5002 Credit 2 9-16-2013
5003 Credit 2 9-17-2013
5004 Cash 3 9-18-2013

OrderDetailsTable

OrderDetailsID OrderID ProductID
70001 5001 401 -
70002 5001 401 -
70003 5001 403 -
70004 5002 401
70005 5002 402
70006 5003 402
70007 5003 403
70008 5004 403 -
70009 5004 402 - 
70010 5004 401 -

Как я буду рассчитывать ProductID на то, сколько было заказа наличными на каждую дату, а затем получить общее количество каждого продукта?

Образец вывода

ProductID ProductDesc CountOnCash OrderDate
401 Hotdog 2 9-15-2013
401 Hotdog 1 9-18-2013
401 Hotdog 3 ---------
402 Ham 1 9-18-2013
402 Ham 1 ---------
403 Bacon 1 9-15-2013
403 Bacon 1 9-18-2013
403 Bacon 2 ---------


Select p.ProductID, p.ProductDesc, count(p.ProductId) as NumOrder, o.OrderDate
from Product p
inner join OrderDetails od on p.productid = od.productid
inner join Order o on o.orderid = od.orderid
where orderpayment = 'cash'
Group by p.ProductID, p.ProductDesc, o.OrderDate
3 ответа

Использование:

GROUP BY p.ProductID, p.ProductDesc, o.OrderDate WITH ROLLUP

См. Документацию

На промежуточных линиях вместо OrderDate будет установлен NULL. Также будут промежуточные итоги для каждого ProductID и для всего запроса. Вы можете отфильтровать их с помощью предложения HAVING или с кодом в приложении, которое выполняет вызов SQL. Добавить в конец запроса:

HAVING p.ProductDesc IS NOT NULL

FIDDLE


Насколько я понимаю, вы хотите иметь промежуточные итоги.

Select p.ProductID, p.ProductDesc, count(p.ProductId) as NumOrder, o.OrderDate
from Product p
inner join OrderDetails od on p.productid = od.productid
inner join Order o on o.orderid = od.orderid
where orderpayment = 'cash'
Group by p.ProductID, p.ProductDesc, o.OrderDate

Union

Select p.ProductID, p.ProductDesc, count(p.ProductId) as NumOrder, '------'
from Product p
inner join OrderDetails od on p.productid = od.productid
inner join Order o on o.orderid = od.orderid
where orderpayment = 'cash'
Group by p.ProductID, p.ProductDesc

вы получите данные.


Вы хотите условное суммирование, поэтому переместите условие из предложения where в оператор case:

Select p.ProductID, p.ProductDesc,
 sum(case when orderpayment = 'cash' then 1 else 0 end) as NumCash,
 count(*) as NumOrder, o.OrderDate
from Product p
inner join OrderDetails od on p.productid = od.productid
inner join Order o on o.orderid = od.orderid
Group by p.ProductID, p.ProductDesc, o.OrderDate

licensed under cc by-sa 3.0 with attribution.