我有以下代码,用于检查产品的表面积并输出一个数字。 然而,它非常有效。 我怎样才能用 Case When、Then 而不是变量和 if else 来编写这段代码?
declare @test decimal(10,2)
select @test = ([WIDTH]/1000)*(HEIGHT]/1000)
from MAIN.SYSADM.[TABLE] where ID=854037 and POS_NR=1
if(@test>1) begin
(
select top(1)360/SUM(CAST([QTY] as int)) from MAIN.SYSADM.[TABLE]
where ID=854037 and POS_NR=1
and BOM_PRODUKT not in (52101,52102,52006,52007,52003,52005,52008,53201,53102)
and (STL_PRODGRP in (26,27,28,30,33,35,412,413,415,425,426,427) or BOM_PRODUKT =50002) GROUP by BOM_NODE )
end
else
begin
(
select top(1)180/SUM(CAST([QTY] as int)) from MAIN.SYSADM.[TABLE]
where ID=854037 and POS_NR=1
and BOM_PRODUKT not in (52101,52102,52006,52007,52003,52005,52008,53201,53102)
and (STL_PRODGRP in (26,27,28,30,33,35,412,413,415,425,426,427) or BOM_PRODUKT =50002) GROUP by BOM_NODE)
end
我尝试了这个,但 top(1) 和 GROUP by 不起作用
select (select top(1) (
case when cast(([WIDTH]/1000)*([HEIGHT]/1000) as decimal(10,2))>1
then
360/sum(CAST([QTY] as int ))
else 180/sum(CAST([QTY] as int ))
end ))
from MAIN.SYSADM.[TABLE] where [ID]=854037 and POS_NR=1
and BOM_PRODUKT not in (52101,52102,52006,52007,52003,52005,52008,53201,53102)
and (STL_PRODGRP in (26,27,28,30,33,35,412,413,415,425,426,427) or BOM_PRODUKT =50002 ) GROUP by BOM_NODE
如果您的数据包含具有
ID = 854037
和 POS_NR = 1
的多行,则您的 @test
计算实际上是在计算多个结果,最后一个结果由 select @test = ...
语句保留。如果每个这样的行都具有相同的 WIDTH
和 HEIGHT
值,则所有结果都将相同,并且选择哪一个并不重要。
一旦将此计算放入
WHEN
表达式的 CASE
子句中,则仅允许一个结果。如果所有结果都相同,您可以应用 MIN()
、MAX()
或 TOP 1
将结果限制为仅该一个值。
更新后的查询将类似于:
select --top(1)
BOM_NODE,
SUM(QTY) as SumQty,
MAX((WIDTH/1000)*(HEIGHT/1000)) as MaxArea,
case when (
select MAX((WIDTH/1000)*(HEIGHT/1000))
from [TABLE]
where ID=854037 and POS_NR=1
) > 1
then 360/SUM(CAST(QTY as int))
else 180/SUM(CAST(QTY as int))
end as Result
from [TABLE]
where ID = 854037
and POS_NR = 1
and BOM_PRODUKT not in (52101,52102,52006,52007,52003,52005,52008,53201,53102)
and (
STL_PRODGRP in (26,27,28,30,33,35,412,413,415,425,426,427)
or BOM_PRODUKT = 50002
)
group by BOM_NODE
我注释掉了
top 1
并添加了一些额外的列来显示一些中间结果。我还清理了一些格式以提高可读性。
使用我生成的一些测试数据,我得到以下结果:
BOM_节点 | 数量 | 最大面积 | 结果 |
---|---|---|---|
1 | 30 | 1.5 | 12 |
2 | 5 | 1.5 | 72 |
BOM_节点 | 数量 | 最大面积 | 结果 |
---|---|---|---|
1 | 30 | 0.5 | 6 |
2 | 5 | 0.5 | 36 |
请参阅 this db<>fiddle 进行演示。
我还相信,如果您将产品属性(如宽度和高度)与数量存储在同一个表中,您会遇到一些严重的数据库设计问题。我建议您阅读“数据库规范化”并应用其中一些技术来改进您的数据模型。
像
CAST(QTY as int)
这样的表达方式也很可疑。您是否将数值存储为文本? 不要。