Заранее извиняюсь за форматирование в этом посте. Я новичок в размещении на Stack Exchange и все еще нахожу свой путь вокруг.
У меня есть запрос, возвращающий набор данных, который ранжирует клиентов по количеству продаж и сумме в долларах. Количество рангов рассчитывается исходя из года и месяца. Я пытаюсь создать новый столбец, который связывает только рейтинг с прошлого месяца и текущего года. В конечном итоге этот столбец будет использоваться в качестве основного уровня группировки для всего набора данных.
Я пытался go об этом с помощью оператора CASE, но я не уверен, что это направление, в котором я должен идти. Мой ELSE ниже - это действительно заполнитель для вывода текущего ранга, связанного с клиентом, которого я на самом деле хочу.
В моей выборке текущих данных в столбце MoYrRnk показаны строки, которые выводятся по желанию.
Является ли оператор CASE хорошим способом получить то, что я показываю в моем желаемом выходе, указанном ниже?
ЕСЛИ нет, как мне go получить запрос о возвращении в соответствии с моим примером желаемого вывода?
Это то, что у меня есть:
Declare @prmCurrYear int = Datepart(yy, Getdate())
, @prmLastMonth int = Datepart(MM, Getdate())-1
Case
When sls.Year = @prmCurrYear And sls.mo_num = @prmLastMonth Then rnk.Rnk
Else 99999
End MoYrRnk
Пример данных:
| MoYrRnk | CustNo | Rnk | year | mo_num | Amount |
|----------|--------|-----|------|--------|------------|
| 99999 | Cust_1 | 100 | 2019 | 1 | 22462.38 |
| 99999 | Cust_1 | 85 | 2020 | 1 | 92950.92 |
| 99999 | Cust_1 | 85 | 2020 | 2 | 129807.16 |
| 99999 | Cust_1 | 100 | 2019 | 2 | 83422.75 |
| 99999 | Cust_1 | 100 | 2019 | 3 | 78469.38 |
| 85 | Cust_1 | 85 | 2020 | 3 | 28171.03 |
| 99999 | Cust_2 | 1 | 2020 | 1 | 820598.94 |
| 99999 | Cust_2 | 2 | 2019 | 1 | 908632.63 |
| 99999 | Cust_2 | 2 | 2019 | 2 | 654689 |
| 99999 | Cust_2 | 1 | 2020 | 2 | 667239.21 |
| 1 | Cust_2 | 1 | 2020 | 3 | 1053866.43 |
| 99999 | Cust_2 | 2 | 2019 | 3 | 735532.61 |
| 99999 | Cust_3 | 3 | 2019 | 1 | 782990.74 |
| 99999 | Cust_3 | 6 | 2020 | 1 | 644845.2 |
| 99999 | Cust_3 | 6 | 2020 | 2 | 488458 |
| 99999 | Cust_3 | 3 | 2019 | 2 | 548259.85 |
| 99999 | Cust_3 | 3 | 2019 | 3 | 591954.48 |
| 6 | Cust_3 | 6 | 2020 | 3 | 329686.73 |
Пример желаемого результата:
| MoYrRnk | CustNo | Rnk | year | mo_num | Amount |
|----------|--------|-----|------|--------|------------|
| 85 | Cust_1 | 100 | 2019 | 1 | 22462.38 |
| 85 | Cust_1 | 85 | 2020 | 1 | 92950.92 |
| 85 | Cust_1 | 85 | 2020 | 2 | 129807.16 |
| 85 | Cust_1 | 100 | 2019 | 2 | 83422.75 |
| 85 | Cust_1 | 100 | 2019 | 3 | 78469.38 |
| 85 | Cust_1 | 85 | 2020 | 3 | 28171.03 |
| 1 | Cust_2 | 1 | 2020 | 1 | 820598.94 |
| 1 | Cust_2 | 2 | 2019 | 1 | 908632.63 |
| 1 | Cust_2 | 2 | 2019 | 2 | 654689 |
| 1 | Cust_2 | 1 | 2020 | 2 | 667239.21 |
| 1 | Cust_2 | 1 | 2020 | 3 | 1053866.43 |
| 6 | Cust_2 | 2 | 2019 | 3 | 735532.61 |
| 6 | Cust_3 | 3 | 2019 | 1 | 782990.74 |
| 6 | Cust_3 | 6 | 2020 | 1 | 644845.2 |
| 6 | Cust_3 | 6 | 2020 | 2 | 488458 |
| 6 | Cust_3 | 3 | 2019 | 2 | 548259.85 |
| 6 | Cust_3 | 3 | 2019 | 3 | 591954.48 |
| 6 | Cust_3 | 6 | 2020 | 3 | 329686.73 |
Полный рейтинг Запрос:
Declare
@prmCurrYear int = Datepart(yy, Getdate())
, @prmLastYear int = Datepart(yy, Getdate())-1
, @prmLastMonth int = Datepart(MM, Getdate())-1
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
Select
Case
When mosls.year1 = @prmCurrYear And mosls.mo_num = @prmLastMonth Then rnk.rnkPounds
Else 99999
End CurrMoYearRnk
,mosls.CustNo, mosls.CustName, rnkPounds, rnk.rnkAmount
, mosls.year1, mosls.mo_num, mosls.mo_name ,mosls.Pounds, mosls.Amount
-- , rnk.Pounds YTDPounds, rnk.Amount YTDAmount
From (
Select sls.CustNo, sls.year1
, Rank() Over(Partition by sls.year1 Order by sls.Pounds Desc) rnkPounds
, Rank() Over(Partition by sls.year1 Order by sls.Amount Desc) rnkAmount
--, Pounds
--, Amount
From (
Select CustNo, dd.year1, Sum(Pounds) Pounds, Sum(sls.Amount) Amount
From (
Select CustNo, [Posting Date], Sum(Pounds) Pounds, Sum(Amount) Amount
From (
Select
sih.[Sell-to Customer No_] CustNo
, sih.[Posting Date]
, Sum(sil.[Qty Lbs]) Pounds
, Sum(sil.Amount) Amount
From [MyDataBase$Sales Invoice Header] sih
Inner Join [MyDataBase$Sales Invoice Line] sil On sih.No_ = sil.[Document No_]
Where 1=1
Group by
sih.[Sell-to Customer No_]
, sih.[Posting Date]
Union All
Select
sih.[Sell-to Customer No_] CustNo
, sih.[Posting Date]
, Sum(sil.[Qty Lbs]) * -1
, Sum(sil.Amount)*-1 Amount
From [MyDataBase$Sales Cr_Memo Header] sih
Inner Join [MyDataBase$Sales Cr_Memo Line] sil On sih.No_ = sil.[Document No_]
Where 1=1
Group by
sih.[Sell-to Customer No_]
, sih.[Posting Date]
) sls
Group By CustNo, [Posting Date]
) sls
Inner Join Helper.dbo.dim_dates dd On sls.[Posting Date] = dd.date1
Where dd.mo_num <= @prmLastMonth --YTD
Group By CustNo, dd.year1
) sls
)rnk
Inner Join (
Select CustNo, cust.Name CustName
, year1, mo_num, mo_name ,Pounds, sls.Amount
From (
Select CustNo, dd.year1, dd.mo_num , dd.mo_name , Sum(Pounds) Pounds, Sum(sls.Amount) Amount
From (
Select CustNo, [Posting Date], Sum(Pounds) Pounds, Sum(Amount) Amount
From (
Select
sih.[Sell-to Customer No_] CustNo
, sih.[Posting Date]
, Sum(sil.[Qty Lbs]) Pounds
, Sum(sil.Amount) Amount
From [MyDataBase$Sales Invoice Header] sih
Inner Join [MyDataBase$Sales Invoice Line] sil On sih.No_ = sil.[Document No_]
Where 1=1
Group by
sih.[Sell-to Customer No_]
, sih.[Posting Date]
Union All
Select
sih.[Sell-to Customer No_] CustNo
, sih.[Posting Date]
, Sum(sil.[Qty Lbs]) * -1
, Sum(sil.Amount)*-1 Amount
From [MyDataBase$Sales Cr_Memo Header] sih
Inner Join [MyDataBase$Sales Cr_Memo Line] sil On sih.No_ = sil.[Document No_]
Where 1=1
Group by
sih.[Sell-to Customer No_]
, sih.[Posting Date]
) sls
Group By CustNo, [Posting Date]
) sls
Inner Join Helper.dbo.dim_dates dd On sls.[Posting Date] = dd.date1
Where dd.mo_num <= @prmLastMonth --YTD
Group By CustNo, dd.year1, dd.mo_num, dd.mo_name
) sls
Inner Join [MyDataBase$Customer] cust On sls.CustNo = cust.No_
) mosls On mosls.CustNo = rnk.CustNo And mosls.year1 = rnk.year1
Where 1=1
And mosls.[year1] Between @prmLastYear And @prmCurrYear
Order by rnkPounds, mo_num