2013-09-19 5 views
0

ProductTable2 Количество в 1 SQL

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 
+0

Извините, что ваш вопрос? Я вижу SQL-запрос. В чем проблема? –

+0

Я думаю, он спрашивает, как получить эту промежуточную строку, которая объединяет все даты. В MySQL это будет «GROUP BY ... WITH ROLLUP», я не знаю, имеет ли это TSQL. – Barmar

+0

выглядит так: http://technet.microsoft.com/en-us/library/ms189305(v=sql.90).aspx – Barmar

ответ

1

Вы хотите условное суммирование, поэтому двигайтесь условием из пункта 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 
+1

Это то, о чем я думал, что он просил сначала, но, глядя на его пример вывода, я не думаю, что это так. См. Мой комментарий выше. – Barmar

1

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

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 

доставит вам данные.

2

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

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

Посмотреть Documentation

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

HAVING p.ProductDesc IS NOT NULL 

FIDDLE

+0

+1. , , Возможно, у вас будет лучшая интерпретация вопроса. –

+0

http://sqlfiddle.com/#!3/790c1/5 –

+0

Это, по сути, то, что вы хотите, не так ли? – Barmar

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