Подсчет всех других типов кроме текущего - PullRequest
0 голосов
/ 23 июля 2010

Я пытаюсь написать этот запрос, который бы вычислял среднее значение всех столбцов, кроме столбца, содержащего значение типа, по которому я группирую весь запрос.

Таким образом, для 4Например, типы, каждый столбец в результирующей таблице будет содержать среднее значение всех трех других значений типа, мне нужно исключить строки текущего типа.

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

SELECT

SUM(some value) / COUNT(TYPE)

FROM TEMPTABLE
GROUP BY TYPE

Теперь я пытаюсь вычислить общее среднее значение для остальных трех.Спасибо.

Ответы [ 5 ]

1 голос
/ 23 июля 2010

Вы можете сделать один запрос, чтобы получить разные типы, и LEFT JOIN той же таблицы, проверяя неравенство типов:

SELECT t1.type,
       SUM(t2.some_value) / COUNT(t2.type)
FROM ( SELECT DISTINCT type FROM temptable ) t1
LEFT JOIN temptable t2 ON ( t1.type <> t2.type )
GROUP BY t1.type

Поскольку вам нужно только среднее значение, вы можете заменить строку

FROM ( SELECT DISTINCT type FROM temptable ) t1

от

FROM temptable t1

но первое решение может работать лучше, так как число строк уменьшается раньше.

0 голосов
/ 23 июля 2010

Я думаю, что вы можете просто использовать это:

SELECT type, avg(col_01)
FROM myTable
GROUP BY type
0 голосов
/ 23 июля 2010

Будет ли это делать то, что вам нужно?

(возможно, с другим оператором CASE, чтобы избежать деления на ноль ошибок, если есть вероятность, что ни один из типов не может быть возвращен, я также явно не учел случай, когда type равен NULL)

SELECT

SUM(CASE WHEN TYPE <> 'Type1' THEN someValue ELSE 0 END) / 
     SUM(CASE WHEN TYPE = 'Type1' THEN 1 ELSE 0 END) AS T1,

SUM(CASE WHEN TYPE <> 'Type2' THEN someValue ELSE 0 END) / 
     SUM(CASE WHEN TYPE = 'Type2' THEN 1 ELSE 0 END) AS T2,

SUM(CASE WHEN TYPE <> 'Type3' THEN someValue ELSE 0 END) / 
     SUM(CASE WHEN TYPE = 'Type3' THEN 1 ELSE 0 END) AS T3,

SUM(CASE WHEN TYPE <> 'Type4' THEN someValue ELSE 0 END) / 
     SUM(CASE WHEN TYPE = 'Type4' THEN 1 ELSE 0 END) AS T4
FROM TEMPTABLE
0 голосов
/ 23 июля 2010

Должно работать и на Sybase:

SELECT
   SUM(some value) / SUM(CASE WHEN TYPE = 1 THEN 1 ELSE 0 END)
FROM TEMPTABLE
GROUP BY TYPE
0 голосов
/ 23 июля 2010

Отправной точкой здесь является создание декартового соединения между вашими типами и вашим искушаемым (предположим, что ваша структура таблиц: type (id, type), valueTable (id, type_id, some_value))

Следующеезапрос

ВЫБРАТЬ t.type, SUM (vt.someValue) / COUNT (*) AS сумму ОТ типа t, valueTable vt ГДЕ vt.type_id! = t.id GROUP BY t.type

должен добиться цели.

...