我正在用SQL编写一个存储过程,作为其中的一部分,我需要 Select 三个可能值(Demand、Average和Forecast)中的最大值.我有查找每个值的查询,但我想知道以下哪个选项是最佳实践:

选项1:将所有三个查询 Select 到临时表中,然后使用CASEWHEN语句为每行 Select 三个查询中的最大值.

选项2:使用联合将我的三个查询合并为一个主要的SELECT语句.

我甚至不知道选项2是否可行,所以如果不是,我将只使用临时表,但我无法想象这是编写我想要的内容的最有效方式.因为我在一个存储过程中使用它,所以我很难 Select 一个测试material 来测试代码,所以我很感激关于这方面的最佳编写实践的任何建议,如果在我测试过程时它不起作用,我可以在这里用更具体的代码提出另一个问题.

选项1:(我知道这段代码可以工作,但它似乎太复杂了,不是最有效的选项)

SELECT Plant, Material, Dmd
INTO #T1
FROM Table1

SELECT Plant, Material, Avg
FROM #T2
FROM Table2

SELECT Plant, Material, Fcst
INTO #T3
FROM Table3

SELECT a.Plant, 
       a.Material, 
       CASE WHEN Dmd > Avg AND Dmd > Fcst THEN Dmd ELSE
       CASE WHEN Avg > Fcst THEN Avg ELSE Fcst END END as 'Output'
FROM #T1 a INNER JOIN
     #T2 b on a.Plant = b.Plant AND a.Material = b.Material INNER JOIN
     #T3 c on a.Plant = c.Plant AND a.Material = c.Material

选项2:(在我的脑海中,这逻辑上应该工作,但我以前没有写过,所以我不知道它有多实用)

SELECT a.Plant,
       a.Material,
       CASE WHEN Dmd > Avg AND Dmd > Fcst THEN Dmd ELSE
       CASE WHEN Avg > Fcst THEN Avg ELSE Fcst END END as 'Output'
FROM 
(SELECT Plant, Material, Dmd
FROM Table1) a
UNION
(SELECT Plant, Material, Avg
FROM Table2) b
UNION
(SELECT Plant, Material, Fcst
FROM Table3) c

如果有帮助的话,我的输入表中的条目应该都是相同的工厂和material 的不同订购数量,所以我知道每个查询中的唯一条目将是相同的工厂和material ,只要我的表1、表2和表3都与输入表连接.

编辑: 表1、2和表3中可能列出的内容以及所需输出的示例: (对不起,如果格式不对,我正在try )

表1(设备、material 、DMD)

1000   x   3

表2(工厂、material 、平均值)

1000   x   6

表3(工厂、material 、FCST)

1000   x   4.5

期望yields (设备、material 、yields )

1000   x   6

推荐答案

您可以使用UNION执行此操作,然后使用它作为子查询来 Select 最大值.

select max(v) from
(
    select Dmd as v from Table1
    union
    select [Avg] as v from Table2
    union
    select Fcst as v from Table3
) src;

或者,您可以使用INNER JOINS—如果您正在寻找每种植物/material 的最大值,使用一个巧妙的技巧将各种值引入子查询,例如.

select a.Plant,a.Material, 
(
    SELECT Max(v) FROM 
    (VALUES (Dmd), ([Avg]), (Fcst)) AS valuestable(v)
) as [MaxV]
from @Table1 a
INNER JOIN @Table2 b ON a.Plant = b.Plant and a.Material = b.Material
INNER JOIN @Table3 c ON a.Plant = c.Plant and a.Material = c.Material;

Sql相关问答推荐

SQL查询以创建手头的流动余额?

数据库索引:如何使用名称和类别对项目进行最佳索引?

SQL Oracle条件分组依据

SQL:计算与另一列中给定值互斥的匹配项

如何根据行状态设置正确的标志

缺少日期标识

合并分层表SQL中的第一个非空、变化的空位置

如何简化此PostgreSQL查询以计算平均值?

通过对象分离实现原子性

用VB.NET在Dapper中实现MS Access数据库顺序透视

如何在多列上编写具有不同条件的查询?

AdventureWorks 查询

SQL 查询是否返回列表中仅包含某些值而不包含其他值的行?

SQL Select 字母范围没有给我任何东西

SQL 如何根据当前事件和下一个事件确定操作的持续时间?

如何在第二个 INSERT 中使用第一个 INSERT 自动生成的 ID

Snowflake 中的对象是如何比较的?

如何根据与 BigQuery 中另一个表的匹配更新一个表中的列?

使用SQL中另一个表的查询结果在表中查找记录

CURRENT_ROW 窗口框架上的 SQL 滞后