Sql 查询中更干净的case语句?

Sql 查询中更干净的case语句?,sql,variables,alias,Sql,Variables,Alias,我在做一个插入,我插入的一个值计算如下: SUM(Value1)/( CASE SUM( CASE Value2 > 0 THEN 1 ELSE 0 END ) = 0 THEN 1 ELSE SUM( CASE Value2 > 0 THEN 1 ELSE 0 END ) ) 内部的案例-部分复制了两

我在做一个插入,我插入的一个值计算如下:

SUM(Value1)/(
    CASE SUM(
        CASE Value2 > 0 
        THEN 1
        ELSE 0 
        END
    ) = 0 
    THEN 1 
    ELSE SUM(
        CASE Value2 > 0 
        THEN 1 
        ELSE 0 
        END
    )
)
内部的
案例
-部分复制了两次,最好将别名或变量设置为该值,并使用该别名或变量。

CTE answer

WITH
  step1 AS
(
  SELECT
    SUM(value1)                            AS interimValue1
    SUM(CASE value2 > 0 THEN 1 ELSE 0 END) AS interimValue2,
    <other fields>
  FROM
    <a query>
)
SELECT
  interimValue / CASE interimValue2 = 0 THEN 1 ELSE interimValue2 END
FROM
  step1
(如果返回0,则返回NULL,允许COALESCE将NULL替换为1s。)


如果
SUM
的结果等于
0
,则
NULL
将产生
NULL
,否则它将返回
SUM
的结果
COALESCE
将保留
NULLIF
的结果,如果它不是
NULL
,则保持不变,否则将返回
1

SQL的味道是什么?你会使用CommonTableExpressions吗?一开始没有对你的答案给予足够的关注。您上次关于返回NULL而不是0的建议实际上是一个非常好的主意!为您提供一个
NULLIF
调用,我必须将其包含在解决方案中。
SELECT
  interimValue / CASE interimValue2 = 0 THEN 1 ELSE interimValue2 END
FROM
(
  SELECT
    SUM(value1)                            AS interimValue1
    SUM(CASE value2 > 0 THEN 1 ELSE 0 END) AS interimValue2,
    <other fields>
  FROM
    <a query>
)
  AS step1
SUM(value1) / COALESCE(SUM(CASE WHEN value2 > 0 THEN 1 ELSE NULL END), 1)
SUM(Value1) / COALESCE(NULLIF(SUM(CASE WHEN Value2 > 0 THEN 1 ELSE 0 END), 0), 1)