2010-07-23 2 views
0

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

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

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

SELECT 

SUM(some value)/COUNT(TYPE) 

FROM TEMPTABLE 
GROUP BY TYPE 

Теперь я пытаюсь вычислить три других в общем среднее. Благодарю.

+0

БД является SyBase кстати – Halo

+0

вы уверены, что вы имеете в виду столбцы, а не строк? Можете ли вы опубликовать структуру таблицы? –

ответ

1

Вы можете сделать один запрос, чтобы получить различные типы и 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 

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

+0

спасибо, я думаю, мне нужно написать что-то вроде этого как вложенный запрос, потому что эта часть является только членом гигантского SELECT. поэтому я не могу напрямую использовать FROM или WHERE – Halo

+0

Не должно быть причин, по которым ответ Питера не может работать как суб-/вложенный запрос, должен ли он? (Моя Sybase ржавая) – Tobiasopdenbrouw

+0

нет, я думаю, не – Halo

0

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

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

ВЫБОР t.type, сУММА (vt.someValue)/ COUNT (*) AS сумму от типа т, встроенного языка В.Т. ГДЕ vt.type_id! = t.id GROUP BY t.type

должен сделать трюк.

+0

thx, хотя я вставляю в valueTable. В начале есть только искушение – Halo

0

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

SELECT 
    SUM(some value)/SUM(CASE WHEN TYPE = 1 THEN 1 ELSE 0 END) 
FROM TEMPTABLE 
GROUP BY TYPE 
+0

да, это правда, но запрос будет делать это для каждого типа. поэтому я не хочу использовать постоянное значение – Halo

0

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

(возможно, с другим 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

thx, это на самом деле неплохая идея, но вместо этого вычитал текущее значение из суммы и разделил его на (COUNT -1) – Halo

0

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

SELECT type, avg(col_01) 
FROM myTable 
GROUP BY type