SQL使用CASE计算值
我正在使用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 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…结尾的方括号丢失了,所以我只删除了开头的一个。