Агрегирование группы по в подзапросе

#sql-server

#sql-сервер

Вопрос:

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

Подзапрос должен возвращать общую сумму всех продаж, чтобы можно было вычислить процент. Но процент неверен, потому что я не могу агрегировать OrderDate, потому что тогда он не будет распознан в инструкции join (невозможно сгруппировать по ГОДУ (OrderDate). Любая информация была бы отличной.

 SELECT Year(t1.OrderDate) as SalesYear,   sum(SubTotal TaxAmt) as Sales,
    sum(SubTotal TaxAmt)  / sum(YearlyGrandTotal) AS [Percent]
 FROM [AdventureWorks2017].[Sales].[SalesOrderHeader] t1
INNER JOIN (
    SELECT  OrderDate,Year(OrderDate) as O, sum(SubTotal TaxAmt) as 
YearlyGrandTotal
    FROM Sales.SalesOrderHeader  
    GROUP BY (OrderDate)
) AS [Total] ON t1.OrderDate = Total.OrderDate
where SalesPersonID = 275

GROUP BY Year(t1.OrderDate)
  

Ответ №1:

С помощью group by year(orderdate) получите sales из salespersonid = 275 и yearlygrandtotal и используйте его в качестве подзапроса для вычисления процента:

 select 
  t.salesyear,
  t.sales,
  100.0 * t.sales / t.yearlygrandtotal percentage
from (
  select 
    year(orderdate) salesyear,
    sum(case when salespersonid = 275 then subtotal   taxamt else 0 end) sales,
    sum(subtotal   taxamt) yearlygrandtotal
  from [AdventureWorks2017].[Sales].[SalesOrderHeader]
  group by year(orderdate) 
) t