SQL Server -

时间:2015-08-18 12:32:04

标签: sql-server optimization sum conditional-statements case-when

如果之前有人问过,请第一次发帖,请原谅我 我不是写SQL的新手,但我也不是专家。

我需要一个更好的方法来写这个:

CASE
WHEN OrderQuantity + Week1Quantity >= CriteriaAmount THEN 1
WHEN OrderQuantity + Week1Quantity + Week2Quantity >= CriteriaAmount THEN 2
WHEN OrderQuantity + Week1Quantity + Week2Quantity + Week3Quantity >= CriteriaAmount THEN 3
WHEN OrderQuantity + Week1Quantity + Week2Quantity + Week3Quantity + Week4Quantity >= CriteriaAmount THEN 4
WHEN OrderQuantity + Week1Quantity + Week2Quantity + Week3Quantity + Week4Quantity + Week5Quantity >= CriteriaAmount THEN 5
WHEN OrderQuantity + Week1Quantity + Week2Quantity + Week3Quantity + Week4Quantity + Week5Quantity + Week6Quantity >= CriteriaAmount THEN 6
WHEN OrderQuantity + Week1Quantity + Week2Quantity + Week3Quantity + Week4Quantity + Week5Quantity + Week6Quantity + Week7Quantity > CriteriaAmount THEN 7
WHEN OrderQuantity + Week1Quantity + Week2Quantity + Week3Quantity + Week4Quantity + Week5Quantity + Week6Quantity + Week7Quantity + Week8Quantity >= CriteriaAmount THEN 8
ELSE 999
END

它的目的是找到目标被击中的第一个阶段,使用每列中的数值作为总计。

表如此:

订单数量 第1周 第2周 第3周 (建议目标)
......... 5 ............ ..... 5 ...... ..... 5 ...... ..... 5 ...... ........... 0.15 .............
........ 10 ........... .... 10 ..... ... 0.10 ..... .... 10 ..... ............ 500 ...... .....

在上表中,第1行将给出2的答案,因为有2周的时间来添加以达到目标。
第2行将落在ELSE语句中,给出999,稍后将转换为错误。

我想要一个更好的方式来写这个,因为我有52个列可以通过你可以想象这是一个白色空间的猪!

谢谢, 亚当

1 个答案:

答案 0 :(得分:0)

桌子的设计很差。几年后它将有数百列。解决这个问题的唯一方法是,如果你不能改变表设计,就是使用带有exec的动态sql。

理智且可维护的方法是将表格设计更改为每个项目编号,周数和项目金额都有一行。然后,您可以使用标准TSQL动词,例如sum和group by。