Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL组合公式时总计不正确_Sql Server_Variables_Aggregate Functions - Fatal编程技术网

Sql server SQL组合公式时总计不正确

Sql server SQL组合公式时总计不正确,sql-server,variables,aggregate-functions,Sql Server,Variables,Aggregate Functions,对于我正在创建的报表,我需要使用两个单独的表达式,并将它们组合成一个解决方案 我需要的第一个表达式是总销售额,由 Sum([DCT].[Quantity_Stk] *[ICP].[UnitCost]) AS [Total Sales] Max(CAST ((@PurchaseCost + @Prod_CostLBS) * @InputWeight AS DECIMAL (18,2))) AS [Cost] 我需要的第二个表达式是总成本,由 Sum([DCT].[Quantity_Stk]

对于我正在创建的报表,我需要使用两个单独的表达式,并将它们组合成一个解决方案

我需要的第一个表达式是总销售额,由

Sum([DCT].[Quantity_Stk] *[ICP].[UnitCost]) AS [Total Sales]
 Max(CAST ((@PurchaseCost + @Prod_CostLBS) * @InputWeight AS DECIMAL (18,2))) AS [Cost]
我需要的第二个表达式是总成本,由

Sum([DCT].[Quantity_Stk] *[ICP].[UnitCost]) AS [Total Sales]
 Max(CAST ((@PurchaseCost + @Prod_CostLBS) * @InputWeight AS DECIMAL (18,2))) AS [Cost]
这两条语句都可以工作,因为它们用于查询中的其他列,并且可以正确显示

为了找出总利润,我尝试使用SUM、AVG、MAX和将其组合成一个表达式,但结果是一个错误。我相信下面的代码有正确的想法,它只是缺少一些重要的部分。也许是一种过度的说法:

CAST (([DCT].[Quantity_Stk] *[ICP].[UnitCost]) - ((@PurchaseCost + @Prod_CostLBS) * @InputWeight) AS DECIMAL(18,2)) AS [Profit]
DECLARE @TotalSales decimal(19,8) = (SELECT Sum([Total Sales]) FROM #TempTable
DECLARE @TotalProfit decimal(19,8) = (SELECT SUM([Profit]) FROM #TempTable
DECLARE @TotalCost decimal(19,8) = (SELECT SUM([Cost]) FROM #TempTable
我的问题是,它正在计算每行的利润,但我只想要总利润。我相信这会使它成为一个聚合函数。或者有没有办法将另外两个表达式存储为变量并使用它们

我正在使用Microsoft SQL Server 2005

完整代码:

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

SET @PurchaseCost = 2.58;
SET @InputWeight = 18100;
SET @Prod_CostLBS  = .15;

SELECT 
     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([DCT].[Quantity_Stk] *[ICP].[UnitCost]) AS [Total Sales]
   , Avg(([IC_ProductLots].[OriginalQuantity_Stk] / [IC_ProductLots].[OriginalQuantity_Alt])) AS [Avg. Box Weight]
   , Sum([IC_ProductLots].[OriginalQuantity_Stk] / @InputWeight) AS [Yield]
   , CAST (@InputWeight - SUM(Sum([IC_ProductLots].[OriginalQuantity_Stk])) OVER () AS DECIMAL(18,2)) AS [Shrink]
   , Max(CAST ((@PurchaseCost + @Prod_CostLBS) * @InputWeight AS DECIMAL (18,2))) AS [Cost]
   , Max(CAST (([DCT].[Quantity_Stk] *[ICP].[UnitCost]) - ((@PurchaseCost + @Prod_CostLBS) * @InputWeight) AS DECIMAL(18,2))) AS [Profit]
 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-24 00:00:00' }   AND (IC_ProductLots.ProductionDate <= { ts '2015-06-24 00:00:00' } OR IC_ProductLots.ProductionDate Is Null)) 
AND ((1=1)  AND [ARC].CustomerKey IN (124) ) 
 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].CustomerKey
 ORDER BY 
     CAST([ARC].[CustomerCode] AS NVARCHAR(40)) + ' - ' + CAST([ARC].[Name] AS NVARCHAR(40)) 
   , CAST (@InputWeight - SUM(Sum([IC_ProductLots].[OriginalQuantity_Stk])) OVER () AS DECIMAL(18,2)) 
   , Max(CAST ((@PurchaseCost + @Prod_CostLBS) * @InputWeight AS DECIMAL (18,2))) 
   , Max(CAST (([DCT].[Quantity_Stk] *[ICP].[UnitCost]) - ((@PurchaseCost + @Prod_CostLBS) * @InputWeight) AS DECIMAL(18,2)))

声明变量:

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

SET @PurchaseCost = 2.58;
SET @InputWeight = 18100;
SET @Prod_CostLBS  = .15;
将所有原始数据放入临时表,如下所示:

    SELECT 
         CAST([ARC].[CustomerCode] AS NVARCHAR(40)) + ' - ' + CAST([ARC].[Name] AS NVARCHAR(40)) AS [Supplier]
       , [PC].ProductCode
       , [PC].Description1
       , IC_ProductLots.OriginalQuantity_Alt AS [Boxes]
       , IC_ProductLots.UnitOfMeasure_Alt
       , IC_ProductLots.OriginalQuantity_Stk AS [Weight]
       , IC_ProductLots.UnitOfMeasure_Stk
       , [ICP].UnitCost AS [Unit Cost]
       , [DCT].[Quantity_Stk] * [ICP].[UnitCost] AS [Total Sales]
       , ([IC_ProductLots].[OriginalQuantity_Stk] / [IC_ProductLots].[OriginalQuantity_Alt]) AS [Avg. Box Weight] --not sure about this one
       , [IC_ProductLots].[OriginalQuantity_Stk] / @InputWeight AS [Yield]
       , CAST([IC_ProductLots].[OriginalQuantity_Stk] AS DECIMAL(18,2)) AS [Shrink]
       , CAST ((@PurchaseCost + @Prod_CostLBS) * @InputWeight AS DECIMAL (18,2)) AS [Cost]
       , CAST (([DCT].[Quantity_Stk] *[ICP].[UnitCost]) - ((@PurchaseCost + @Prod_CostLBS) * @InputWeight) AS DECIMAL(18,2)) AS [Profit]
  INTO #TempTable
     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-24 00:00:00' }   AND (IC_ProductLots.ProductionDate <= { ts '2015-06-24 00:00:00' } OR IC_ProductLots.ProductionDate Is Null)) 
    AND ((1=1)  AND [ARC].CustomerKey IN (124) ) 


您是否试图获得所有产品的总利润?意思是每行显示相同的值?在这种情况下,您可以使用[your table]中的嵌套Select SUM[your formula]作为总计Profit@Samcd是的,不一定每一行都显示相同的值,因为我会将其铸造为标题,但是是的,总利润应该只有一个值,整个报告应该是相同的。这有意义吗?为什么要用MAX?@Samcd作为第二个表达式?因为这是我能让它正常工作的唯一方法。嗯,正确设置值的格式,但是数字太离谱了。这可能是我这边的一个错误。以这种方式声明变量的问题是,我不能在集合中使用WHERE语句,因为WHERE根据用户输入而变化。您能否将没有聚合的基本数据放入临时表中,然后从那里进行计算?我不这么认为,因为我公司使用的程序不允许我添加表格。所有表都已预构建。创建临时表不需要权限。从[…]中选择[…]到EntertableName。该表将在会话关闭时删除