如何在不使用变量的情况下编写这段代码

问题描述 投票:0回答:1

我有以下代码,用于检查产品的表面积并输出一个数字。 然而,它非常有效。 我怎样才能用 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 
sql sql-server
1个回答
0
投票

如果您的数据包含具有

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)
这样的表达方式也很可疑。您是否将数值存储为文本? 不要。

© www.soinside.com 2019 - 2024. All rights reserved.