Я пытаюсь добавить продажи MTD в запрос SQL. Я выяснил, как это сделать с JOINS, но я хочу использовать CTE для расчета продаж MTD, а затем использовать его для вычисления projected_sales.Formula для прогнозируемых продаж - (MTD/wkdaysinmonth*wkdaystodate
) [который также хранится в таблице CTE). Есть ли способ сделать это легко? Я написал следующий код:
Введите:
Email PaymentAmount orderdate
xyz@gmail.com 10 11/01/2018
xyz@gmail.com 20 11/09/2018
образец вывода:
EmailAddress MTD Projected_sales
xyz@gmail.com 30 0.19
, где Прогнозируемые продажи рассчитываются как количество дней passed=7
и общее количество рабочих дней в 22 ноября . {[30/7*22]=0.19
} (Present date = 11/09/2018
)
with dates as(
select dateadd(d,-day(getdate())+1,convert(date,getdate())) as startofmonth,
dateadd(d,-1,dateadd(m,1,dateadd(d,-day(getdate())+1,convert(date,getdate())))) as endofmonth,
convert(date,getdate()) as today
)
,daycounts as(
select dates.*,
(DATEDIFF(dd, startofmonth, endofmonth) + 1)
-(DATEDIFF(wk, startofmonth, endofmonth) * 2)
-(CASE WHEN DATENAME(dw, startofmonth) = 'Sunday' THEN 1 ELSE 0 END)
-(CASE WHEN DATENAME(dw, endofmonth) = 'Saturday' THEN 1 ELSE 0 END) as wkdaysinmonth,
(DATEDIFF(dd, startofmonth, today) + 1)
-(DATEDIFF(wk, startofmonth, today) * 2)
-(CASE WHEN DATENAME(dw, startofmonth) = 'Sunday' THEN 1 ELSE 0 END)
-(CASE WHEN DATENAME(dw, today) = 'Saturday' THEN 1 ELSE 0 END) as wkdaystodate
from dates
)
SELECT DISTINCT Customers.EmailAddress as email,
o1.YTD
FROM
Customers
INNER JOIN
Orders
ON
Orders.CustomerID= Customers.CustomerID
JOIN
(SELECT
c.EmailAddress,
SUM(Orders.PaymentAmount) AS YTD
FROM
Customers c
JOIN
Orders
ON c.CustomerID=Orders.CustomerID
WHERE
Orders.OrderDate BETWEEN '01/01/2018 00:00' AND GETDATE()
GROUP BY
EmailAddress) AS o1 ON o1.EmailAddress = Customers.EmailAddress
WHERE
Orders.OrderDate >= (GETDATE()-7)