2

我创建了一个 SQL 查询,它按预期工作,但在 SELECT 语句中使用了大量重复代码来计算一个值。

例如在我的 SQL 语句中,这一行:

SUM(od.Number01) OVER (ORDER BY od.Number01)

对不同公式中的多个 SELECT 条件重复。

例如

(rd.OurQty - SUM(od.Number01) OVER (ORDER BY od.Number01) + od.Number01) AS 'Left In Stock'

CASE WHEN (rd.OurQty - SUM(od.Number01) 
OVER (ORDER BY od.Number01) + od.Number01) - od.Number01 > 0 THEN od.Number01 ELSE (CASE WHEN (rd.OurQty - SUM(od.Number01) OVER (ORDER BY od.Number01) 
+ od.Number01) > 0 THEN (rd.OurQty - SUM(od.Number01) OVER (ORDER BY od.Number01) + od.Number01) ELSE 0 END) END AS 'Allocated'

对于小型数据集,这不是什么大问题。然而,当数据集变得更大时,就会出现问题。

如何在每行计算中存储一次该语句的结果,然后在所需的计算中使用存储在整个 SELECT 语句中的局部变量中的结果,而不是多次执行相同的计算?

我正在使用 Microsoft SQL Server Management Studio 2012

4

2 回答 2

4

为什么不使用CTE来定义 SUM,然后再使用它呢?

可以将公用表表达式 (CTE) 视为在单个 SELECT、INSERT、UPDATE、DELETE 或 CREATE VIEW 语句的执行范围内定义的临时结果集。CTE 类似于派生表,因为它不存储为对象,并且仅在查询期间持续存在。与派生表不同,CTE 可以是自引用的,并且可以在同一查询中多次引用。

就像是

WITH Vals AS (
    SELECT  *,
            SUM(Number01) OVER(ORDER BY Number01) MySum
    FROM    MyTable
)
SELECT *,
        MySum
FROM Val

SQL 小提琴演示

于 2013-07-18T12:15:35.563 回答
0

在 Oracle 中,我会这样做(我认为您可以为 SQL Server 的方言修复它):

select
  case
    when (sq.ourqty - sq.number01_sum + sq.number01) - sq.number01 > 0
      then
        sq.number01
    else
      case
        when (sq.ourqty - sq.number01_sum + sq.number01) > 0
          then 
            sq.ourqty - sq.number01_sum + sq.number01
          else
            0
      end
  end as allocated
  , ...
from
(
select sum(od.number01) over (order by od.number01) as number01_sum
       , od.number01 as number01
       , rd.ourqty as ourqty
       , ...
from anytable1 od
     , anytable2 rd
where ...
) sq
于 2013-07-18T12:29:41.573 回答