Как сделать расчет SQL из вида? - PullRequest
1 голос
/ 06 марта 2012

У меня есть представление, которое генерирует результат запроса, как показано ниже:

channel | current_Month | total_month_count | type | total_type_count |
-----------------------------------------------------------------------
chaA    |             2 |                 1 |    N |                1 |
-----------------------------------------------------------------------
chaB    |             2 |                 2 |    N |                2 |
-----------------------------------------------------------------------
chaA    |             2 |                 3 |    Y |                3 |
-----------------------------------------------------------------------

Я хотел бы сделать запрос на представление, которое может получить значение total_month_count типа 'Y', чтобы минус значениеtotal_month_count типа 'N' в той же группе каналов.В этом случае будут затронуты 2 строки, это строка 1 и строка 3, которые будут 3 минус 1, а результат будет эквивалентен 2.

Как я могу сделать запрос, который мог бы вернутьмне результат 2 базы на это представление в Informix?Не ограничиваясь Informix, подойдет любая другая БД, мне просто интересно узнать, есть ли какое-нибудь решение сделать это в SQL?

Ответы [ 3 ]

3 голосов
/ 06 марта 2012
SELECT  Channel,
        SUM(CASE WHEN Type = 'N' THEN -1 ELSE 1 END * total_month_count) "Calculation"
FROM    yourView
GROUP BY Channel

РЕДАКТИРОВАТЬ 2

Подумав об этом (после легкого подталкивания Марка Баннистера) и проведя некоторое тестирование, я удалил версии Join из своего ответа. Это менее эффективно, чем группировка.

2 голосов
/ 06 марта 2012

Предполагая, что ваше имя представления равно tab_values ​​

select ty.total_month_count - tn.total_month_count, ty.channel 
from tab_values ty, tab_values tn
where ty.channel = tn.channel
and ty.type = 'Y' 
and tn.type = 'N'
1 голос
/ 06 марта 2012

Я бы попробовал что-то вроде следующего:

SELECT channel,
       SUM(CASE WHEN TYPE = 'Y' THEN total_month_count ELSE 0 END -
       CASE WHEN TYPE = 'N' THEN total_month_count ELSE 0 END )
  FROM t
 GROUP BY channel

Он вернет вам total_month_count, где type = 'Y' минус total_month, где type = 'N', сгруппированный по каналу, что означает, что если для канала, у которого есть только тип 'N', будет возвращено отрицательное значение.

...