Более чистые операторы внутри запросов? - PullRequest
3 голосов
/ 04 января 2012

Я делаю вставку, и одно из значений, которые я вставляю, рассчитывается следующим образом:

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
    )
)

Внутренняя CASE -часть дублируется дважды, было бы неплохо установить псевдоним или переменную в это значение и использовать вместо этого псевдоним или переменную.

Ответы [ 2 ]

1 голос
/ 04 января 2012
SUM(Value1) / COALESCE(NULLIF(SUM(CASE WHEN Value2 > 0 THEN 1 ELSE 0 END), 0), 1)

NULLIF даст NULL, если результат SUM равен 0, в противном случае он вернет результат SUM. COALESCE оставит результат NULLIF без изменений, если он не NULL, в противном случае будет возвращен 1.

1 голос
/ 04 января 2012

CTE ответ ...

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

Версия SubQuery ...

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

Или, более конкретно, к указанному вами SQL-запросу, но не к общему случаю ...

SUM(value1) / COALESCE(SUM(CASE WHEN value2 > 0 THEN 1 ELSE NULL END), 1)

(Возвращение NULL, где вы возвращаете 0, позволяет COALESCE заменитьNULL с 1 с.)

...