我正在根據表中的日期欄位進行查詢以獲取(當前 過去 2 個月)QTY 的總和。
CREATE table #temp_Sales
( Client varchar(10),
Sale_Month Date,
Qty int)
Insert into #temp_Sales VALUES
( 'AAAA', '2022-06-01', 5 ),
( 'AAAA', '2022-05-01', 10 ),
( 'AAAA', '2022-05-01', 2 ),
( 'AAAA', '2022-04-01', 5 ),
( 'AAAA', '2022-02-01', 15),
( 'BBBB', '2022-05-01', 2 ),
( 'BBBB', '2022-04-01', 4),
( 'BBBB', '2022-03-01', 6 ),
( 'BBBB', '2022-03-01', 10 ),
( 'BBBB', '2022-01-01', 6 ),
( 'BBBB', '2021-10-01', 10),
( 'BBBB', '2021-09-01', 2 ),
( 'BBBB', '2021-11-01', 4 ),
( 'BBBB', '2021-08-01', 6),
( 'BBBB', '2021-07-01', 8 ),
( 'CCCC', '2021-11-01', 2 ),
( 'CCCC', '2021-10-01', 3 ),
( 'CCCC', '2021-09-01', 30 ),
( 'CCCC', '2021-06-01', 4 )
樣本資料:

預期輸出:

Sale_month 不是連續的,同一個月對于表中的客戶可以出現多次。
示例:對于客戶 AAAA 和銷售月份 2022-06-01,數量應包括當前和過去 2 個月(2022-06-01、2022-05-01 和 2022-04-01)的總和(數量)客戶。數量 = 5 10 2 5 = 22
對于客戶 BBBB 和銷售月 2022-03-01 。數量 = 6 10 6 = 22
;With da AS
(SELECT *, DATEADD(MM,-2,Sale_month)as last_two_Months FROM #temp_Sales)
Select Client,Sale_month,Sum(qty) from da
WHERE Sale_month Between last_two_Months and Sale_month
GROUP BY Client,Sale_month
Order by client
嘗試了上面的查詢。但無法按預期作業,不確定如何使用 last_two_Months 和 Sale_month 進行分組。任何幫助深表感謝。
uj5u.com熱心網友回復:
這是您可以解決此問題的一種方法。
select Sale_Month
, client
, Last3Months = max(x.PeriodSales)
from #temp_Sales s
cross apply
(
select PeriodSales = sum(Qty)
from #temp_Sales s2
where s2.Sale_Month >= dateadd(month, -2, s.Sale_Month)
and s2.Sale_Month <= s.Sale_Month
and s2.Client = s.Client
) x
group by Sale_Month
, client
order by Client
, Sale_Month desc
uj5u.com熱心網友回復:
按 qty 分組以消除重復項,然后像這樣加入自己:
;WITH CTE AS(
select
[Client],
[Sale_Month],
SUM(QTY) QTY
from #tmp
group by
[Client],
[Sale_Month]
)
select a.[Client], a.[Sale_Month], SUM(b.QTY) QTY
from
CTE a
INNER JOIN CTE b on
a.Client = b.Client and
DATEDIFF(mm, b.[Sale_Month], a.[Sale_Month]) between 0 and 2
group by
a.[Client], a.[Sale_Month]
uj5u.com熱心網友回復:
首先,如果您還沒有日歷表,請購買一個。
之后,您可以通過將JOIN資料從Sales表中寫入日歷表來創建所需的資料集,然后通過 a 獲取銷售額LEFT JOIN并聚合它們。SUM然后,您可以在過去 3 個月內使用視窗化。最后,由于您似乎不想要不存在的月份,請將它們過濾掉:
WITH Clients AS(
SELECT Client,
MIN(Sale_Month) AS MinMonth,
MAX(Sale_Month) AS MaxMonth
FROM dbo.Sales
GROUP BY Client),
ClientDates AS(
SELECT C.Client,
CT.CalendarDate
FROM Clients C
JOIN dbo.CalendarTable CT ON C.MinMonth <= CT.CalendarDate
AND C.MaxMonth >= CT.CalendarDate
WHERE CT.CalenderDay = 1),
ClientSales AS(
SELECT CD.Client,
CD.CalendarDate,
SUM(S.Qty) AS Qty
FROM ClientDates CD
LEFT JOIN dbo.Sales S ON CD.Client = S.Client
AND CD.CalendarDate = S.Sale_Month
GROUP BY CD.Client,
CD.CalendarDate),
Last3 AS(
SELECT CS.Client,
CS.CalendarDate,
CS.Qty,
SUM(CS.Qty) OVER (PARTITION BY CS.Client ORDER BY CS.CalendarDate
ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) AS Last3Months
FROM ClientSales CS)
SELECT L3.Client,
L3.CalendarDate AS Sale_Month,
L3.Last3Months
FROM Last3 L3
WHERE L3.Qty IS NOT NULL
ORDER BY Client,
Sale_Month DESC;
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/492722.html
