Использование псевдонима в вычислении SQL
У меня есть столбец с именем Total_Returned_Value. Я хочу суммировать все отдельные возвращаемые значения, чтобы получить итоговое общее возвращаемое значение всех возвратов. Из-за структуры таблицы этот столбец имеет дубликаты, поэтому я не могу просто суммировать этот столбец. Я хочу суммировать этот столбец на основе другого столбца типа "id" с именем Customer_Purchase_Order_Number, где он суммирует только один из каждого номера заказа на покупку.
Вот как я это делаю.
,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
Таким образом, он организует его с помощью Customer_Purchase_Order_Number, присваивает каждому набору равных чисел номер строки и суммирует только те, у которых номер строки = 1.
Кажется, довольно прямо. Тем не менее я получаю сообщение об ошибке "Неверное имя столбца" RN ". Если я пытаюсь поместить оператор выбора номера строки непосредственно в оператор case, он говорит мне, что у меня не может быть агрегата внутри агрегата. Кто-нибудь знает что делать?
Вот некоторые другие вещи, которые я пробовал,
Попытка поместить оператор номера строки в оператор Case
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
Это не работает, потому что я получаю сообщение об ошибке "Оконные функции нельзя использовать в контексте другой оконной функции или агрегата".
Я попытался просто поместить оболочку выбора вокруг псевдонима (как уже упоминалось в этом ответе Использование псевдонима в вычислениях SQL, в котором мой исходный вопрос был помечен как дубликат)
,ROW_NUMBER() OVER (PARTITION BY Customer_Purchase_Order_Number ORDER BY Customer_Purchase_Order_Number) as rn
,SUM(CASE WHEN (SELECT rn) = 1 then rh.Total_Returned_Value ELSE 0 END) OVER (PARTITION BY rh.Customer_Number) as Total_Returned_Values
Кто-нибудь знает, как решить эту проблему?
Вот мой полный запрос на всякий случай:
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
,ROW_NUMBER() OVER (PARTITION BY Customer_Purchase_Order_Number ORDER BY Customer_Purchase_Order_Number) as rn
,SUM(CASE WHEN (SELECT 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)
ORDER BY Total_Items_Returned_Number desc, Total_Items_Returned_NumberColor desc