Вычисляемый столбец На основе двух вычисляемых столбцов

StackOverflow https://stackoverflow.com/questions/889711

Вопрос

Я пытаюсь сделать довольно сложную SELECT вычисления, которые я буду обобщать:

  1. Основной запрос - это выбор подстановочного знака для таблицы
  2. Один подзапрос выполняет COUNT() из всех элементов, основанных на условии (это работает нормально)
  3. Другой подзапрос выполняет SUM() чисел в столбце, основанных на другом условии.Это также работает корректно, за исключением случаев, когда ни одна запись не соответствует условиям, она возвращает NULL.

Изначально я хотел сложить два подзапроса, что-то вроде (subquery1)+(subquery2) AS total который работает нормально, если только subquery2 не равен null, и в этом случае total становится нулевым, независимо от того, каков результат subquery1 .Моей второй мыслью было попытаться создать третий столбец, который должен был представлять собой вычисление двух подзапросов (т. е., (subquery1) AS count1, (subquery2) AS count2, count1+count2 AS total) но я не думаю, что возможно вычислить два вычисляемых столбца, и даже если бы это было так, я чувствую, что возникает та же проблема.

Есть ли у кого-нибудь элегантное решение этой проблемы, помимо простого получения двух значений подзапроса и суммирования их в моей программе?

Спасибо!

Это было полезно?

Решение

Здесь возникают две проблемы:

  • Вы не можете использовать псевдоним одного столбца в другом выражении в том же списке ВЫБОРА.

    Однако вы можете установить псевдонимы в подзапросе производной таблицы и использовать их во внешнем запросе.

  • Вы не можете выполнять арифметику с помощью NULL, потому что NULL - это не ноль.

    Однако вы можете установить значение NULL по умолчанию в ненулевое значение, используя COALESCE() функция.Эта функция возвращает свой первый ненулевой аргумент.

Вот пример:

SELECT *, count1+count2 AS total
FROM (SELECT *, COALESCE((subquery1), 0) AS count1, 
                COALESCE((subquery2), 0) AS count2 
      FROM ... ) t;

(помните, что производной таблице должен быть присвоен псевдоним таблицы "t" в этом примере)

Другие советы

Во -первых, функция Coalesce должна помочь вам позаботиться о любых нулевых проблемах.

Не могли бы вы использовать союз, чтобы объединить эти два запроса в один набор результатов, а затем рассматривать его как подзаконную линию для дальнейшего анализа?

Или, может быть, я не полностью понял ваш вопрос?

Я бы попробовал (для второго запроса) что -то вроде: выберите Sum (Isnull (Mycolumn, 0)) // Пожалуйста, проверьте синтаксис в этом, прежде чем использовать его, хотя ...

Это должно вернуть 0 вместо нуля для любого экземпляра этого столбца нулевого.

Можно было бы быть ненужным сказать, но, поскольку вы используете ее внутри программы, вы предпочитаете использовать программу логики, чтобы подвести итог (NULL и число) из -за проблем с переносимостью.

Кто знает, когда функция Coalesce устарела или если другой СУБД поддерживает ее или нет.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top