T- SQL: Как установить вычисленное значение столбца по заданным c критериям фильтра? - PullRequest
0 голосов
/ 06 апреля 2020

Заранее извиняюсь за форматирование в этом посте. Я новичок в размещении на 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
...