Как сгруппировать в SQL Server Query - PullRequest
1 голос
/ 23 октября 2019

Я использую этот запрос, чтобы получить сумму SaleAmount для каждого типа (SOType) счетов-фактур продажи.
Я получаю результат, но результат не сгруппирован по SOType. Попытался использовать Группировать за пределами запроса после условия "где", но получил ошибку как

"Столбец" SaleInvoices.InvoiceID 'недопустим, поскольку он не содержится ни в агрегате, ни в группе по функции ".

DECLARE @fromDate Datetime = '2019/05/23'
DECLARE @toDate Datetime = '2019/10/25'
DECLARE @isKpi int = '1'

SELECT (                      
  (Select Sum((Isnull(I.Quantity,0)*Isnull(I.SalePrice,0))+((Isnull(I.Quantity,0)*Isnull(I.SalePrice,0) - I.Discount) *(I.TAX/100))) 
  from ItemsSold as I 
  where I.InvoiceId= S.InvoiceID and I.InvoiceType='Sale Invoice'
  ) -
  (Select isnull(Sum((Isnull(I.Quantity,0)*Isnull(I.SalePrice,0))+((Isnull(I.Quantity,0)*Isnull(I.SalePrice,0) - I.Discount)*(I.TAX/100))),0)
  from ItemsSold as I 
  where I.InvoiceId= S.InvoiceID and I.InvoiceType='Sale Return'

  )) as Total

  ,S.SOType as SOType 

  FROM SaleInvoices AS S

  where S.OrderDate>=Convert(VARCHAR,@fromDate,111) and S.OrderDate<=Convert(varchar,@toDate,111)  

enter image description here

1 Ответ

1 голос
/ 23 октября 2019

Вы хотите условную агрегацию. Логика должна выглядеть примерно так:

select s.SOType,                      
       sum(case when i.invoicetype = 'Sale Invoice'
                then (I.Quantity * I.SalePrice) * (1 - i.discount) * i.tax / 100.0 
                when i.invoicetype = 'Sale Return'
                then - (I.Quantity * I.SalePrice) * (1 - i.discount) * i.tax / 100.0
            end) as Total
from SaleInvoices s join
     ItemsSold i
     on i.InvoiceId= s.InvoiceID 
where s.OrderDate >= @fromDate and 
      s.OrderDate <= @toDate
group by s.SOType ;

Я не уверен, что получил правильную арифметику.

Примечания:

  • Предложение group byопределяет строки, возвращаемые запросом. Если вы хотите одну строку на SOType, тогда вы хотите GROUP BY SOType.
  • Использовать сравнения дат и функции для дат. Абсурдно преобразовывать дату в строку для сравнения с датой.
  • Возможно, вам не нужны COALESCE() или ISNULL() для обработки NULL значений. Они обычно игнорируются функциями агрегирования.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...