Расчетный столбец на основе двух расчетных столбцов - PullRequest
4 голосов
/ 20 мая 2009

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

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

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

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

Спасибо!

Ответы [ 4 ]

11 голосов
/ 20 мая 2009

Здесь происходит две проблемы:

  • Нельзя использовать псевдоним одного столбца в другом выражении в том же списке SELECT.

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

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

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

Вот пример:

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

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

3 голосов
/ 20 мая 2009

Прежде всего, функция COALESCE должна помочь вам решить любые нулевые проблемы.

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

А может я не совсем понял ваш вопрос?

1 голос
/ 20 мая 2009

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

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

0 голосов
/ 28 февраля 2011

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

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

...