2015-07-13 5 views
0

Для отчета, который я создаю, мне нужно взять рассчитанный СУММ и использовать его для другого уравнения. Уравнение используется для расчета Термоусадки, что является тем же самым отличием. Для расчета Shrink я использую:Ошибка агрегатной функции для расчета

@InputWeight - Sum([IC_ProductLots].[OriginalQuantity_Stk]) AS [Shrink] 

Вес вход задается пользователем перед запуском отчета. Так, например, если входной вес составляет 15 000, а сумма SUM - 14,800, то Shrink должен быть 200.

Проблема заключается в том, что этот код вычисляет сокращение для каждой строки, и каждый отчет должен иметь ОДИН Сжатие.

Пример вывода будет выглядеть следующим образом:

Input Weight: 15,000 
Product # | Weight | Shrink 
1234  | 7,000 | 
1235  | 6,500 | 
1236  | 500 | 
1237  | 800 | 
-------------------------- 
TOTAL  |14,800 | 200 

Я использую Microsoft SQL Server 2005.

Ниже мой полный код, если это помогает:

SET NOCOUNT ON; 
DECLARE @PurchaseCost Decimal(19,8); 
DECLARE @InputWeight Decimal(19,8); 

SET @PurchaseCost = 1; 
SET @InputWeight = 15000; 
    SELECT DISTINCT 
     CAST([ARC].[CustomerCode] AS NVARCHAR(40)) + ' - ' + CAST([ARC].[Name] AS NVARCHAR(40)) AS [Supplier] 
     , [PC].ProductCode 
     , [PC].Description1 
     , Count(IC_ProductLots.OriginalQuantity_Alt) AS [Boxes] 
     , IC_ProductLots.UnitOfMeasure_Alt 
     , Sum(IC_ProductLots.OriginalQuantity_Stk) AS [Weight] 
     , IC_ProductLots.UnitOfMeasure_Stk 
     , [ICP].UnitCost AS [Unit Cost] 
     , Sum(ROUND([DCT].[Quantity_Stk] *[ICP].[UnitCost], 2)) AS [Total Sales] 
     , Avg(([IC_ProductLots].[OriginalQuantity_Stk]/[IC_ProductLots].[OriginalQuantity_Alt])) AS [Avg. Box Weight] 
     , Sum([IC_ProductLots].[OriginalQuantity_Stk]/@InputWeight) AS [Yield] 
     , @InputWeight - Sum([IC_ProductLots].[OriginalQuantity_Stk]) AS [Shrink] 
    FROM ((((IC_Products [PC] 
     INNER JOIN DC_Transactions [DCT] 
     ON [PC].ProductKey = [DCT].ProductKey) 
     INNER JOIN AR_Customers [ARC] 
     ON [DCT].CustomerKey = [ARC].CustomerKey) 
     INNER JOIN IC_ProductLots 
     ON [DCT].LotKey = IC_ProductLots.LotKey) 
     LEFT OUTER JOIN IC_ProductCosts [ICP] 
     ON ICP.ProductKey=PC.ProductKey and ICP.ProductCostCode=5) 
    WHERE 
     (IC_ProductLots.ProductionDate >= { ts '2015-06-29 00:00:00' } AND (IC_ProductLots.ProductionDate <= { ts '2015-06-29 00:00:00' } OR IC_ProductLots.ProductionDate Is Null)) 
    AND ([ARC].CustomerCode = '   904') 
    GROUP BY 
     CAST([ARC].[CustomerCode] AS NVARCHAR(40)) + ' - ' + CAST([ARC].[Name] AS NVARCHAR(40)) 
     , [PC].ProductCode 
     , [PC].Description1 
     , IC_ProductLots.UnitOfMeasure_Alt 
     , IC_ProductLots.UnitOfMeasure_Stk 
     , [ICP].UnitCost 
     , IC_ProductLots.ProductionDate 
     , [ARC].CustomerCode 
    ORDER BY 
     CAST([ARC].[CustomerCode] AS NVARCHAR(40)) + ' - ' + CAST([ARC].[Name] AS NVARCHAR(40)) 

В основном, Мне нужно рассчитать общую усадку, а не усадку для каждой отдельной строки.

Обновления:

Я пытался использовать

@InputWeight - Sum([IC_ProductLots].[OriginalQuantity_Stk]) OVER(PARTITION BY [ARC].[CustomerCode]) AS [Shrink] 

Но я получаю ошибку: «Колонка„IC_ProductLots.OriginalQuantity_Stk“недопустим в списке выбора, поскольку он не содержится ни в одном агрегированную функцию или предложение GROUP BY ".

ответ

1

Я думаю, что выражение вы хотите:

@InputWeight - SUM(Sum([IC_ProductLots].[OriginalQuantity_Stk])) OVER() 

Примечание: вам не нужно использовать select distinct с group by, так что вы должны удалить различны.