单个CASE用于多列数据

时间:2016-06-26 05:11:12

标签: sql sql-server

从Excel和Crystal Report的SQL Server查询具有数量和价格的项目。数量和价格是批量(磅)。我需要将其转换为包装数量和包价格。每个行李数据的磅数不在SQL服务器中,并且每个项目的数据都不同。我的物品只有20左右。我无法创建永久或临时表来存储SQL Server中每个数据包的磅数。我可以在SQL中使用CASE来计算行李数量和价格。但是,它需要两个CASE。如何使用一个CASE或其他方法来简化SQL并使其易于维护?我目前的SQL。

SELECT Item, Quantity, Price, 
CASE item
    WHEN ‘Item1’ THEN Quantity/32
    WHEN ‘Item2’ THEN Quantity/33
    …
    ELSE Quantity
END AS QtyPerBag,
CASE item
    WHEN ‘Item1’ THEN Price*32
    WHEN ‘Item2’ THEN Quantity*33
    …
    ELSE Price
END AS PricePerBag
FROM MasterTable

2 个答案:

答案 0 :(得分:3)

DhruvJoshi的方法是一种很好的方法。使用VALUES()构造函数,它甚至更简单:

SELECT mt.Item, mt.Quantity, mt.Price,
       mt.Quantity/factors.Factor AS QtyPerBag, 
       Price * Factors.factor AS PricePerBag
FROM MasterTable mt LEFT JOIN 
     (VALUES ('Item1', 32), ('Item2', 33)
     ) factors(item, factor)
     ON factors.item = mt.item;

注意:如果您将数量存储为整数,那么您应该使用小数点作为因子(除非您想要整数除法)。

答案 1 :(得分:1)

正如评论中已经指出的那样,你应该考虑使用表/集方法。

如果您想在查询中执行此操作,可以使用以下方法:

SELECT Item, Quantity, Price, Quantity/Factor AS QtyPerBag, 
Price * Factor AS PricePerBag
FROM MasterTable LEFT JOIN 
(
SELECT 'Item1' as Item, '32' as Factor 
UNION 
SELECT 'Item2' as Item, '33' as Factor 
-- and so on ...
) T
ON T.item=masterTable.item