【问题标题】:SQL Server - Multiple SUM CASE WHENSQL Server - 多个 SUM CASE WHEN
【发布时间】:2015-08-18 12:32:03
【问题描述】:

第一次发帖,如果之前有人问过,请原谅我。
我对编写 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.................. ....15........
........10............ kbd>....10.........10.........10.................500............

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

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

谢谢, 亚当

【问题讨论】:

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


    【解决方案1】:

    桌子的设计很差。几年后,它将有数百列。如果您无法更改表设计,则处理此问题的唯一方法是使用带 exec 的动态 sql。

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

    【讨论】:

    • 表格设计限制为 52 列 - 一年中的周数。假设初始订单金额为 1 个火星棒。基本上这是计算一个盒子里能装多少火星棒,建议的目标是盒子的大小。需要注意的是,它必须适用于不同尺寸的物品,比如 twixs。所以我已经计算了每周 mars bar 和 twix 的总大小,现在我需要尽可能接近这个总数,以免浪费盒子里的任何空间。
    • 即使“只有”52 个重复列,针对这样的表编写 sql 语句也是非常具有挑战性的。 sql server 表不是 Excel。如果您现在可以更改您的表格设计,否则您每次使用此表格时都必须进行非常广泛的变通方法。
    • 请问您能推荐一个桌子设计吗?我不确定我是否理解。
    • 您可能需要 3 张桌子。表一是项目编号,订购数量。表二是项目编号、周数、数量。表 3 为项目编号,建议目标。这是一种关系设计,然后您可以对这些表执行“标准”sql。
    • 关系设计没有重复的列,表中的每一列都依赖于主键,并且只依赖于主键。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-22
    • 2016-07-08
    • 2021-08-18
    • 1970-01-01
    • 1970-01-01
    • 2011-08-27
    • 1970-01-01
    相关资源
    最近更新 更多