Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.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使用CASE计算值_Sql_Sql Server 2005_Case_Cumulative Sum - Fatal编程技术网

SQL使用CASE计算值

SQL使用CASE计算值,sql,sql-server-2005,case,cumulative-sum,Sql,Sql Server 2005,Case,Cumulative Sum,我正在使用CASE根据产品类别计算物品的总重量 为此,我使用以下代码: CASE WHEN [PC].[ProductCategoryCode] = 5870 THEN SUM(SUM([PL].[OriginalQuantity_Stk])) OVER (PARTITION BY [PC].[ProductCategoryCode]) WHEN [PC].[ProductCategoryCode] = 5730 THEN SUM(SUM([PL].[OriginalQuantity_Stk]

我正在使用CASE根据产品类别计算物品的总重量

为此,我使用以下代码:

CASE WHEN [PC].[ProductCategoryCode] = 5870 THEN SUM(SUM([PL].[OriginalQuantity_Stk])) OVER (PARTITION BY [PC].[ProductCategoryCode]) 
WHEN [PC].[ProductCategoryCode] = 5730 THEN SUM(SUM([PL].[OriginalQuantity_Stk])) OVER (PARTITION BY [PC].[ProductCategoryCode])
WHEN [PC].[ProductCategoryCode] = 5990 THEN SUM(SUM([PL].[OriginalQuantity_Stk])) OVER (PARTITION BY [PC].[ProductCategoryCode])
ELSE SUM(SUM([PL].[OriginalQuantity_Stk])) OVER()
END
 AS [Total Weight]
587057305990都显示正确的总重量。问题来自
ELSE
部分。其余的值都有不同的产品类别代码,但它们需要分组在一起,我需要这些值的总重量。目前,
ELSE
部分正在计算所有项目的总数,包括产品587057305990

例如:

Product Category Code | Weight |
5870                  | 100    |
5730                  | 400    |
5990                  | 200    |
1111                  | 50     |  
2222                  | 175    |  
3333                  | 500    |  
4444                  | 125    |  

5870 = 100
5730 = 400
5990 = 200
ELSE = 850
全部代码:

SET NOCOUNT ON; 
DECLARE @Credits Decimal(19,8);
DECLARE @Price Decimal(19,8);

SET @Credits = 41000;
SET @Price = 1.57;

SELECT 
     CASE WHEN [PC].[ProductCategoryCode] = 5870 THEN 'Trimmings' 
WHEN [PC].[ProductCategoryCode] = 5730 THEN 'Rib Tips'
WHEN [PC].[ProductCategoryCode] = 5990 THEN 'Skins'
ELSE [PC].[Description1] 
END AS [Description]
   , CASE WHEN [PC].[ProductCategoryCode] = 5870 THEN SUM(SUM([PL].[OriginalQuantity_Stk])) OVER (PARTITION BY [PC].[ProductCategoryCode]) 
WHEN [PC].[ProductCategoryCode] = 5730 THEN SUM(SUM([PL].[OriginalQuantity_Stk])) OVER (PARTITION BY [PC].[ProductCategoryCode])
WHEN [PC].[ProductCategoryCode] = 5990 THEN SUM(SUM([PL].[OriginalQuantity_Stk])) OVER (PARTITION BY [PC].[ProductCategoryCode])
ELSE SUM(SUM([PL].[OriginalQuantity_Stk])) OVER()
END
 AS [Total Weight]
   , Sum(CASE WHEN [PC].[ProductCategoryCode] <> 5870 THEN [PL].[OriginalQuantity_Stk] 
WHEN [PC].[ProductCategoryCode] <> 5730 THEN [PL].[OriginalQuantity_Stk] 
WHEN [PC].[ProductCategoryCode] <> 5990 THEN [PL].[OriginalQuantity_Stk] 
END) AS [Weight]
   , @Credits - SUM(Sum([PL].[OriginalQuantity_Stk])) OVER () AS [Shrink]
   , CASE WHEN [PC].[ProductCategoryCode] = 5870 THEN SUM(Sum([PL].[OriginalQuantity_Stk]) / @Credits) OVER (PARTITION BY [PC].[ProductCategoryCode]) 
WHEN [PC].[ProductCategoryCode] = 5730 THEN SUM(Sum([PL].[OriginalQuantity_Stk]) / @Credits) OVER (PARTITION BY [PC].[ProductCategoryCode])
WHEN [PC].[ProductCategoryCode] = 5990 THEN SUM(Sum([PL].[OriginalQuantity_Stk]) / @Credits) OVER (PARTITION BY [PC].[ProductCategoryCode])
ELSE Sum([PL].[OriginalQuantity_Stk]) / @Credits
END AS [Yield]
   , CASE WHEN [PC].[ProductCategoryCode] = 5870 THEN [ICP].[UnitCost] 
WHEN [PC].[ProductCategoryCode] = 5730 THEN [ICP].[UnitCost] - 0.25 
WHEN [PC].[ProductCategoryCode] = 5990 THEN [ICP].[UnitCost] * 0 
ELSE [ICP].[UnitCost]
END AS [UC]
   , CASE WHEN [PC].[ProductCategoryCode] = 5870 THEN [ICP].[UnitCost] * SUM(Sum([PL].[OriginalQuantity_Stk]) / @Credits) OVER (PARTITION BY [PC].[ProductCategoryCode])
WHEN [PC].[ProductCategoryCode] = 5730 THEN ([ICP].[UnitCost] - 0.25) * SUM(Sum([PL].[OriginalQuantity_Stk]) / @Credits) OVER (PARTITION BY [PC].[ProductCategoryCode])
WHEN [PC].[ProductCategoryCode] = 5990 THEN ([ICP].[UnitCost] * 0) * SUM(Sum([PL].[OriginalQuantity_Stk]) / @Credits) OVER (PARTITION BY [PC].[ProductCategoryCode])
ELSE [ICP].[UnitCost] * SUM(Sum([PL].[OriginalQuantity_Stk]) / @Credits) OVER (PARTITION BY [PC].[ProductCategoryCode])
END AS [Value]
   , CASE WHEN [PC].[ProductCategoryCode] = 5780 OR [PC].[ProductCategoryCode] < 5700 THEN SUM(Sum([PL].[OriginalQuantity_Stk]) / @Credits * [ICP].[UnitCost])
OVER (PARTITION BY [PC].[ProductCategoryCode])
END AS [TotalValue]
 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 [PL] 
     ON [DCT].LotKey = [PL].LotKey)
    LEFT OUTER JOIN  IC_ProductCosts [ICP] 
     ON ICP.ProductKey=PC.ProductKey and ICP.ProductCostCode=5)
 WHERE 
    ([PL].ProductionDate >= { ts '2015-07-10 00:00:00' }   AND ([PL].ProductionDate <= { ts '2015-07-10 00:00:00' } OR [PL].ProductionDate Is Null)) 
AND ((1=1)  AND [ARC].CustomerKey IN (39) ) 
 GROUP BY 
     CASE WHEN [PC].[ProductCategoryCode] = 5870 THEN 'Trimmings' 
WHEN [PC].[ProductCategoryCode] = 5730 THEN 'Rib Tips'
WHEN [PC].[ProductCategoryCode] = 5990 THEN 'Skins'
ELSE [PC].[Description1] 
END
   , [ARC].CustomerKey
   , [PC].ProductCategoryCode
   , CASE WHEN [PC].[ProductCategoryCode] = 5870 THEN [ICP].[UnitCost] 
WHEN [PC].[ProductCategoryCode] = 5730 THEN [ICP].[UnitCost] - 0.25 
WHEN [PC].[ProductCategoryCode] = 5990 THEN [ICP].[UnitCost] * 0 
ELSE [ICP].[UnitCost]
END
   , [ICP].UnitCost
   , [PC].ProcessCode
 ORDER BY 
     @Credits - SUM(Sum([PL].[OriginalQuantity_Stk])) OVER () 
   , CASE WHEN [PC].[ProductCategoryCode] = 5870 THEN SUM(SUM([PL].[OriginalQuantity_Stk])) OVER (PARTITION BY [PC].[ProductCategoryCode]) 
WHEN [PC].[ProductCategoryCode] = 5730 THEN SUM(SUM([PL].[OriginalQuantity_Stk])) OVER (PARTITION BY [PC].[ProductCategoryCode])
WHEN [PC].[ProductCategoryCode] = 5990 THEN SUM(SUM([PL].[OriginalQuantity_Stk])) OVER (PARTITION BY [PC].[ProductCategoryCode])
ELSE SUM(SUM([PL].[OriginalQuantity_Stk])) OVER()
END
设置不计数;
声明小数点后的学分(19,8);
声明价格小数(19,8);
设置@Credits=41000;
设定@Price=1.57;
挑选
当[PC].[ProductCategoryCode]=5870时,则为“Trimmings”
当[PC].[ProductCategoryCode]=5730时,则为“肋骨尖端”
当[PC].[ProductCategoryCode]=5990时,则为“皮肤”
ELSE[PC]。[说明1]
结束为[说明]
,在[PC].[ProductCategoryCode]=5870的情况下,将[PC].[ProductCategoryCode]划分为[PC].[ProductCategoryCode])和(和([PL].[OriginalQuantity_Stk])
当[PC].[ProductCategoryCode]=5730时,将[PC].[ProductCategoryCode]分区后的[PL].[OriginalQuantity]相加
当[PC].[ProductCategoryCode]=5990时,将[PC].[ProductCategoryCode]分区后的[PL].[OriginalQuantity]相加
ELSE总和(总和([PL].[OriginalQuantity_Stk])超过()
结束
AS[总重量]
,求和(当[PC].[ProductCategoryCode]5870然后[PL].[OriginalQuantity_Stk]时的情况)
当[PC].[ProductCategoryCode]5730时,则[PL].[OriginalQuantity\u Stk]
当[PC].[ProductCategoryCode]5990时,则[PL].[OriginalQuantity\u Stk]
结束)作为[重量]
,@Credits-SUM(SUM([PL].[OriginalQuantity_Stk])超过()作为[Shrink]
,在[PC].[ProductCategoryCode]=5870的情况下,将[PC].[ProductCategoryCode]划分为[PC].[ProductCategoryCode]和[PL].[OriginalQuantity]/@Credits]
当[PC].[ProductCategoryCode]=5730时,将[PC].[ProductCategoryCode]划分为[PC].[ProductCategoryCode]之后的总和(总和([PL].[OriginalQuantity]/@Credits)
当[PC].[ProductCategoryCode]=5990时,将[PC].[ProductCategoryCode]划分为[PC].[ProductCategoryCode]之后的总和(总和([PL].[OriginalQuantity]/@Credits)
其他总额([PL].[OriginalQuantity]/@Credits
以[收益]结束
,当[PC].[ProductCategoryCode]=5870时,则为[ICP].[UnitCost]
当[PC].[ProductCategoryCode]=5730时,则[ICP].[UnitCost]-0.25
当[PC].[ProductCategoryCode]=5990时,则[ICP].[UnitCost]*0
其他[国际比较项目][单位成本]
以[UC]结束
,当[PC].[ProductCategoryCode]=5870时,则[ICP].[UnitCost]*总和(总和([PL].[OriginalQuantity]/@Credits)超过(按[PC].[ProductCategoryCode]划分)
当[PC].[ProductCategoryCode]=5730时,则([ICP].[UnitCost]-0.25)*总和(总和([PL].[OriginalQuantity].[OriginalQuantity]/@Credits)超过(由[PC].[ProductCategoryCode]分割)
当[PC].[ProductCategoryCode]=5990时([ICP].[UnitCost]*0)*和(和([PL].[OriginalQuantity].[OriginalQuantity]/@Credits)超过(按[PC].[ProductCategoryCode]划分)
其他[ICP].[UnitCost]*总和(总和([PL].[OriginalQuantity]/@Credits)超过(按[PC].[ProductCategoryCode]划分)
结束为[值]
,当[PC].[ProductCategoryCode]=5780或[PC].[ProductCategoryCode]<5700时,则求和(求和([PL].[OriginalQuantity.[U Stk])/@Credits*[ICP].[UnitCost])
超过(按[PC].[ProductCategoryCode]分区)
结束为[总价值]
来自(((IC_产品[PC]
内部联接DC_事务[DCT]
在[PC]上。ProductKey=[DCT]。ProductKey)
内部联接AR_客户[ARC]
在[DCT]上。CustomerKey=[ARC]。CustomerKey)
内部连接IC_产品批次[PL]
在[DCT].LotKey=[PL].LotKey上
左外连接IC_产品成本[ICP]
关于ICP.ProductKey=PC.ProductKey和ICP.ProductCostCode=5)
哪里

([PL].ProductionDate>={ts'2015-07-10 00:00:00'}和([PL].ProductionDate如果我理解正确,您希望将
案例
放在窗口函数中:

SUM(SUM(PL.OriginalQuantity_Stk)) OVER
       (PARTITION BY (CASE WHEN PC.ProductCategoryCode IN (5870, 5730, 5990)
                           THEN PC.ProductCategoryCode
                      END)
       ) as [Total Weight]

您可以使用以下两种查询来完成此操作:

SELECT P.[PseudoCode], SUM(P.[OriginalQuantity_Stk]) AS CalcWeight FROM (
    SELECT CASE
        WHEN [PC].[ProductCategoryCode] = 5730 THEN '5730'
        WHEN [PC].[ProductCategoryCode] = 5870 THEN '5870'
        WHEN [PC].[ProductCategoryCode] = 5990 THEN '5990'
            ELSE 'ELSE' END AS PseudoCode, [PL].[OriginalQuantity_Stk]
    FROM IC_Products [PC]) P
GROUP BY PseudoCode

此外,在您的查询中,您有太多的case语句…您是否考虑设置一个表变量,并将每一个产品类型代码中的所有不同的值放入其中,然后加入这个表?代码将更容易阅读和维护。

当我尝试运行时,我得到了错误[[微软] [ODBC SQLServer驱动程序] [SQLServer ] ]。以“OriginalQuantity_Stk”)开头的标识符太长了(按(587057305990)中的PC.ProductCategoryCode进行分区,然后是PC.ProductCategoryCode)。最大长度为128。“@Austin…结尾的方括号丢失了,所以我只删除了开头的一个。