0

My query is a bit long so I'm going to try to keep things short and only talk about relevant information. I have a column called Total_Returned_Value. I want to sum all the individual return values to get the final total return value of all returns. Because of the structure of the table, that column has duplicates so I can't just sum that column. I want to sum that column based on another "id" type column called Customer_Purchase_Order_Number where it only sums for one of each Purchase Order Number .

This is how I'm doing it.

,rn = ROW_NUMBER() OVER (PARTITION BY Customer_Purchase_Order_Number ORDER BY Customer_Purchase_Order_Number)

,SUM(CASE WHEN rn = 1 then rh.Total_Returned_Value ELSE 0 END) OVER (PARTITION BY rh.Customer_Number) as Total_Returned_Values 

So it organizes it by Customer_Purchase_Order_Number, assigns each set of equal numbers a row number, and only sums the ones where row number = 1.

Seems pretty straight forward. However, I get the error "Invalid column name 'rn'." If I try to put the row number select statement directly into the case statement, it tells me that I cannot have an aggregate within an aggregate. Does anyone know what to do?

This is my full code.

DECLARE @LocalCompanyCode VARCHAR(5)
SET @LocalCompanyCode = '03'
DECLARE @LocalDivisionCode VARCHAR(5)
SET @LocalDivisionCode = '001'
DECLARE @LocalFROMDate DATETIME
SET @LocalFROMDate = '2/04/2019'
DECLARE @LocalToDate DATETIME
SET @LocalToDate = '2/08/2019'
SET NOCOUNT ON;

WITH rh AS

(SELECT  rh.Company_Code
        ,rh.Division_Code
        ,rh.Date_Created
        ,rh.Customer_Number 
        ,rh.Customer_Purchase_Order_Number
        ,rh.Return_Number
        ,(rh.Total_Value-rh.Freight_Charges) as Returned_Value
        ,rh.Freight_Charges
        ,rh.Remarks
        ,SUM(rh.Total_Value-rh.Freight_Charges) 
            OVER (PARTITION BY rh.Customer_Purchase_Order_Number) as Total_Returned_Value

FROM [JMNYC-AMTDB].[AMTPLUS].[dbo].Returns_Header rh (nolock)

)

SELECT   rh.Company_Code
        ,rh.Division_Code
        ,rh.Date_Created
        ,rh.Customer_Number  
        ,rh.Customer_Purchase_Order_Number
        ,rh.Return_Number
        ,rd.Item_Number
        ,Sum(rd.Quantity_Returned) OVER (PARTITION BY rd.Item_Number) as Total_Items_Returned_Number
        ,rd.Color_Code
        ,Sum(rd.Quantity_Returned) OVER (PARTITION BY rd.Item_Number, rd.Color_Code) as Total_Items_Returned_NumberColor
        ,rd.Quantity_Returned
        ,rh.Returned_Value
        ,rh.Freight_Charges
        ,rh.Remarks
        ,rh.Total_Returned_Value

        /*,rn = ROW_NUMBER() OVER (PARTITION BY Customer_Purchase_Order_Number ORDER BY Customer_Purchase_Order_Number)

        ,SUM(CASE WHEN rn = 1 then rh.Total_Returned_Value ELSE 0 END) OVER (PARTITION BY rh.Customer_Number) as Total_Returned_Values*/

        ,DENSE_RANK() OVER (PARTITION BY rh.Customer_Number ORDER BY rh.Customer_Purchase_Order_Number ASC) 
            + DENSE_RANK() OVER (PARTITION BY rh.Customer_Number ORDER BY rh.Customer_Purchase_Order_Number DESC) 
                - 1 AS Total_Returns_Count

        ,SUM(CASE WHEN rh.Remarks LIKE '%lost%' then 1 ELSE 0 END) OVER (PARTITION BY rh.Customer_Number) as "Lost_Packages"

        ,SUM (Quantity_Returned) OVER () as "Total_ReturnedItems_Count" 

FROM rh

LEFT JOIN

[JMNYC-AMTDB].[AMTPLUS].[dbo].Returns_Detail rd (nolock) 
    on rd.Return_Number = rh.Return_number

WHERE 
    (rh.Company_Code = @LocalCompanyCode OR @LocalCompanyCode IS NULL) AND 
    (rh.Division_Code = @LocalDivisionCode OR @LocalDivisionCode IS NULL) AND
    rh.Customer_Number = 'ecom2x' AND 
    rh.Customer_Purchase_Order_Number not like '%bulk%' AND
    rh.Date_Created BETWEEN @LocalFROMDate AND DATEADD(dayofyear, 1, @LocalToDate)
    --AND rh.remarks like '%magic%'

ORDER BY Total_Items_Returned_Number desc, Total_Items_Returned_NumberColor desc 
Natan
  • 139
  • 2
  • 13
  • Put the RowNumber select into a CTE so it has a name, and then select from that CTE. – pmbAustin Feb 11 '19 at 17:30
  • @pmbAustin Can you tell me more about how to do that? I'm still a SQL newbie in a lot of aspects – Natan Feb 11 '19 at 17:40
  • Not an answer to your current problem, but perhaps an explanation for a future one. NOLOCK has lots of interesting "features" like randomly returning missing and/or duplicate rows. Many other "fun" things it does too....https://blogs.sentryone.com/aaronbertrand/bad-habits-nolock-everywhere/ – Sean Lange Feb 11 '19 at 17:44

1 Answers1

0

I have fixed your query . you cannot use RN as its an alias column name so use full replacement of rn and it will work

DECLARE @LocalCompanyCode VARCHAR(5)
SET @LocalCompanyCode = '03'
DECLARE @LocalDivisionCode VARCHAR(5)
SET @LocalDivisionCode = '001'
DECLARE @LocalFROMDate DATETIME
SET @LocalFROMDate = '2/04/2019'
DECLARE @LocalToDate DATETIME
SET @LocalToDate = '2/08/2019'
SET NOCOUNT ON;

WITH rh AS

(SELECT  rh.Company_Code
        ,rh.Division_Code
        ,rh.Date_Created
        ,rh.Customer_Number 
        ,rh.Customer_Purchase_Order_Number
        ,rh.Return_Number
        ,(rh.Total_Value-rh.Freight_Charges) as Returned_Value
        ,rh.Freight_Charges
        ,rh.Remarks
        ,SUM(rh.Total_Value-rh.Freight_Charges) 
            OVER (PARTITION BY rh.Customer_Purchase_Order_Number) as Total_Returned_Value

FROM [JMNYC-AMTDB].[AMTPLUS].[dbo].Returns_Header rh (nolock)

)

SELECT   rh.Company_Code
        ,rh.Division_Code
        ,rh.Date_Created
        ,rh.Customer_Number  
        ,rh.Customer_Purchase_Order_Number
        ,rh.Return_Number
        ,rd.Item_Number
        ,Sum(rd.Quantity_Returned) OVER (PARTITION BY rd.Item_Number) as Total_Items_Returned_Number
        ,rd.Color_Code
        ,Sum(rd.Quantity_Returned) OVER (PARTITION BY rd.Item_Number, rd.Color_Code) as Total_Items_Returned_NumberColor
        ,rd.Quantity_Returned
        ,rh.Returned_Value
        ,rh.Freight_Charges
        ,rh.Remarks
        ,rh.Total_Returned_Value

        ,rn = ROW_NUMBER() OVER (PARTITION BY Customer_Purchase_Order_Number ORDER BY Customer_Purchase_Order_Number)

        ,SUM(CASE WHEN ROW_NUMBER() OVER (PARTITION BY Customer_Purchase_Order_Number ORDER BY Customer_Purchase_Order_Number) = 1 then rh.Total_Returned_Value ELSE 0 END) OVER (PARTITION BY rh.Customer_Number) as Total_Returned_Values

        ,DENSE_RANK() OVER (PARTITION BY rh.Customer_Number ORDER BY rh.Customer_Purchase_Order_Number ASC) 
            + DENSE_RANK() OVER (PARTITION BY rh.Customer_Number ORDER BY rh.Customer_Purchase_Order_Number DESC) 
                - 1 AS Total_Returns_Count

        ,SUM(CASE WHEN rh.Remarks LIKE '%lost%' then 1 ELSE 0 END) OVER (PARTITION BY rh.Customer_Number) as "Lost_Packages"

        ,SUM (Quantity_Returned) OVER () as "Total_ReturnedItems_Count" 

FROM rh

LEFT JOIN

[JMNYC-AMTDB].[AMTPLUS].[dbo].Returns_Detail rd (nolock) 
    on rd.Return_Number = rh.Return_number

WHERE 
    (rh.Company_Code = @LocalCompanyCode OR @LocalCompanyCode IS NULL) AND 
    (rh.Division_Code = @LocalDivisionCode OR @LocalDivisionCode IS NULL) AND
    rh.Customer_Number = 'ecom2x' AND 
    rh.Customer_Purchase_Order_Number not like '%bulk%' AND
    rh.Date_Created BETWEEN @LocalFROMDate AND DATEADD(dayofyear, 1, @LocalToDate)
    --AND rh.remarks like '%magic%'

ORDER BY Total_Items_Returned_Number desc, Total_Items_Returned_NumberColor desc 
Jin Thakur
  • 2,711
  • 18
  • 15
  • That was the first thing I tried... I get the error message "Windowed functions cannot be used in the context of another windowed function or aggregate." – Natan Feb 11 '19 at 17:34
  • Ok then make subquery . I just checked syntax and gave you new code you can send me whole schema and I can send you query .I forgot about windowed function .I did not run query just syntax check . – Jin Thakur Feb 11 '19 at 17:37
  • How do I send you the whole schema? Or make a subquery? I know what a subquery is but I do not know how to make one for this situation. I am still new to SQL – Natan Feb 11 '19 at 17:46
  • jinusa2007@hotmail.com jinusa2007@gmail.com share in Google drive or One drive all tables create and sample insert script for 2-3 rows. – Jin Thakur Mar 01 '19 at 20:27