2016-04-08 2 views
1

Я пишу сценарий, чтобы вернуть мне общую стоимость продаж для клиента в MS SQL.Расчет общей стоимости продаж для клиента

Однако, когда я вхожу в сценарий, мне не возвращается правильная сумма. Я считаю, что это может быть связано с тем, как я присоединился к моим таблицам, или где-то я пропускаю функцию SUM. В любом случае, я в тупик, любая помощь будет очень признательна. Edit: К сожалению забыл упомянуть, что нужно взять в переменном в @CustomerName для использования с различными клиентами

create procedure TotalSalesValue @CustomerName varchar(30) 
AS 
SELECT top 1 @CustomerName, sum(quantity * SellingPrice) amount 
from tblCustomer c 
join tblProduct p 
    on c.CustomerID=p.ProductID 
join tblSOLine so 
    on so.ProductID = p.ProductID 
group by c.CustomerName 
order by amount desc 

Я включил мою схему базы данных, а также, в случае необходимости. Еще раз спасибо!

базы данных схема:

enter image description here

+0

' SELECT top 1 c.CustomerName ... ', т.е. без' @ '? – jarlh

ответ

0

Может быть так

create procedure TotalSalesValue @CustomerName varchar(30) 
AS 
    SELECT q0.CustomerName, sum(q0.amount) as 'amount' FROM (
     SELECT c.CustomerName, sum(so.quantity * p.SellingPrice) as 'amount' 
     from tblCustomer c 
     join tblProduct p 
     on c.CustomerID=p.ProductID 
     join tblSOLine so 
     on so.ProductID = p.ProductID 
     where [email protected]) as q0 

Процедура выбирает все суммы для целевого клиента по имени.

+1

Зачем вам писать это с помощью подзапроса? –

+0

, потому что может быть много клиентов с тем же именем –

+0

Я решил удалить подзапрос. он не нужен здесь, предполагая, что имя клиента уникально. –

0

Вы пропускаете таблицу на SELECT, вы должны присоединиться tblSOHeader в Ордена, чтобы принять во внимание все заказы клиентов

create procedure TotalSalesValue @CustomerName varchar(30) 
AS 
SELECT top 1 @CustomerName, sum(SO.quantity * p.SellingPrice) amount 
from tblCustomer c 
inner join tblSOHeader h ON h.CustomerID=c.CustomerID 
inner join tblSOLine so ON so.SOHeaderID=h.SOHeaderID 
inner join tblProduct p ON so.ProductID=p.ProductID 
group by c.CustomerName 
order by amount desc 
0

Разъяснение по вопросам с запросом:

  1. Вы присоединились к tblProduct с tblCustomer, что невозможно сделать согласно схеме
  2. Необходимо присоединиться к tblSoHeader, в котором есть customerID, а затем присоединиться, что tblSOLine, а затем tblProduct
  3. Наконец, так как вам это нужно для данного клиента, что customerName должен находиться в пункте where

Пожалуйста, попробуйте ниже запрос

create procedure TotalSalesValue @CustomerName varchar(30) 
AS 
    SELECT CustomerName, sum(so.quantity * p.SellingPrice) amount 
    from tblCustomer c 
     join tblSoHeader H on c.CustomerID = H.CustomerID 
     join tblSOLine so on so.SoHeaderID = H.SoheaderID 
     join tblProduct p on p.ProductID = so.ProductID 
    where [email protected] 
    group by c.CustomerName 
Смежные вопросы