Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 AVG и REPLACEв запросе.  [new]
Integer__
Member

Откуда:
Сообщений: 11
Добрый день. Помогите, пожалуйста, грамотно составить запрос.
В таблице pTablename требуется вычислить среднее значение параметров в колонке pEquip за период между pStartDate и pEndDate. При этом нулевые значения в колонке pEquip нужно заменять значениями из колонки pEquip2. Тип данных в pEquip и pEquip2 - real.
Вот такой запрос для VS:
pStr = "SELECT AVG (REPLACE (" + pEquip + ", 0, " + pEquip2 + ")) From " + pTableName + " Where (Дата_Время BETWEEN '" + pStartDate + "' AND '" + pEndDate + "')" + " AND (" + pEquip + " = 0)";
не работает. Причем по отдельности REPLACE и AVG отлично справляются

Где я ошиблась? ( Заранее спасибо за участие
12 май 11, 12:02    [10640527]     Ответить | Цитировать Сообщить модератору
 Re: AVG и REPLACEв запросе.  [new]
Glory
Member

Откуда:
Сообщений: 104751
Integer__

Где я ошиблась?

REPLACE заменяет подстроку в строке, а не меняет значение полей между собой
12 май 11, 12:05    [10640545]     Ответить | Цитировать Сообщить модератору
 Re: AVG и REPLACEв запросе.  [new]
Integer__
Member

Откуда:
Сообщений: 11
Ок, как тогда мне решить задачу?
12 май 11, 12:09    [10640568]     Ответить | Цитировать Сообщить модератору
 Re: AVG и REPLACEв запросе.  [new]
Glory
Member

Откуда:
Сообщений: 104751
Integer__
Ок, как тогда мне решить задачу?

Изучить функцию CASE
12 май 11, 12:10    [10640577]     Ответить | Цитировать Сообщить модератору
 Re: AVG и REPLACEв запросе.  [new]
Integer__
Member

Откуда:
Сообщений: 11
да, спасибо. очень помогли
12 май 11, 12:45    [10640865]     Ответить | Цитировать Сообщить модератору
 Re: AVG и REPLACEв запросе.  [new]
Начинающий SQL 2008
Member

Откуда:
Сообщений: 438
Integer__,

Давайте сюда заполенные тестовые данные, что-то типа такого:
declare @t table (Parent varchar(50), Child varchar(50))
insert @t
 select 'Depart 1','Podrazdel 1_1' union all select 'Depart 1','Podrazdel 1_2' union all select 'Depart 2','Podrazdel 2_1' union all
 select 'Depart 2','Podrazdel 2_2' union all select 'Podrazdel 1_1','Otdel 1_1' union all select 'Podrazdel 1_1','Otdel 1_2' 

select * from @t

И желаемый результат.
12 май 11, 12:46    [10640873]     Ответить | Цитировать Сообщить модератору
 Re: AVG и REPLACEв запросе.  [new]
iljy
Member

Откуда:
Сообщений: 8711
Integer__,

isnull(nullif(pEquip,0),pEquip2)
12 май 11, 13:02    [10640987]     Ответить | Цитировать Сообщить модератору
 Re: AVG и REPLACEв запросе.  [new]
Integer__
Member

Откуда:
Сообщений: 11
Вот пример моей таблицы:
Дата_время 1 pEquip2 2 3 4 pEquip 5 6
07.10.2009 22:40:00 3.4 0.2 3.8 3 0.3 0 0.3 0.3
07.10.2009 22:50:00 3.5 0.2 4.1 3 0.3 0 0.3 0.3
07.10.2009 23:00:00 3.8 0.2 4.5 3.4 0.3 0 0.3 0.3
07.10.2009 23:10:00 3.9 0.2 4.1 3.4 0.3 0 0.3 0.3
07.10.2009 23:20:00 3.8 0.2 4.1 3.4 0.3 0 0.3 0.3
07.10.2009 23:30:00 3.4 0.2 3.8 2.6 0.3 0 0.3 0.3
07.10.2009 23:40:00 3.1 0.3 3.8 2.2 0.3 0 0.3 0.3
07.10.2009 23:50:00 3 0.2 3.4 2.2 0.3 0 0.3 0.3
08.10.2009 0:00:00 2.2 0.3 3 1.5 0.3 0 0.3 0.3
08.10.2009 0:10:00 1.9 0.2 2.2 1.5 2.4 0.4 3.2 1.8
08.10.2009 0:20:00 1.2 0.3 1.9 0.4 2.5 0.3 3.2 1.8
08.10.2009 0:30:00 0.6 0.3 1.5 0.4 2.6 0.3 3.3 1.9
08.10.2009 0:40:00 0.4 0.1 1.1 0.4 2.7 0.2 3.6 2.1
08.10.2009 0:50:00 0.6 0.4 1.5 0.4 2.6 0.7 3.7 1.2
08.10.2009 1:00:00 1 0.3 1.5 0.4 1.1 0.4 1.9 0.5

По умолчанию результат считается как среднее значение по столбцу 4. Если в столбце pEquip значение = 0, расчет по столбцу 1, если в pEquip значение != 0 - расчет по столбцу 4.

Т.е. для данного примера для всего временного интервала считаем среднее из составного столбца:
Дата_время
07.10.2009 22:40:00 3.4
07.10.2009 22:50:00 3.5
07.10.2009 23:00:00 3.8
07.10.2009 23:10:00 3.9
07.10.2009 23:20:00 3.8
07.10.2009 23:30:00 3.4
07.10.2009 23:40:00 3.1
07.10.2009 23:50:00 3
08.10.2009 0:00:00 2.2
08.10.2009 0:10:00 2.4
08.10.2009 0:20:00 2.5
08.10.2009 0:30:00 2.6
08.10.2009 0:40:00 2.7
08.10.2009 0:50:00 2.6
08.10.2009 1:00:00 1.1
12 май 11, 13:07    [10641017]     Ответить | Цитировать Сообщить модератору
 Re: AVG и REPLACEв запросе.  [new]
stimpi
Member

Откуда: Киев, Украина
Сообщений: 662
Integer__
При этом нулевые значения в колонке pEquip нужно заменять значениями из колонки pEquip2.


вот
COALESCE(pEquip, pEquip2)
12 май 11, 13:27    [10641163]     Ответить | Цитировать Сообщить модератору
 Re: AVG и REPLACEв запросе.  [new]
stimpi
Member

Откуда: Киев, Украина
Сообщений: 662
stimpi
Integer__
При этом нулевые значения в колонке pEquip нужно заменять значениями из колонки pEquip2.


вот
COALESCE(pEquip, pEquip2)


собно нулевый понял как NULL ), так что не правильно подсказал.
12 май 11, 13:30    [10641182]     Ответить | Цитировать Сообщить модератору
 Re: AVG и REPLACEв запросе.  [new]
Integer__
Member

Откуда:
Сообщений: 11
Вроде разобралась более-менее. Вот:
SELECT AVG(CASE WHEN pEquip = 0 THEN pEquip2 ELSE pEquip END) FROM pTableName Where (Дата_Время BETWEEN pStartDate AND pEndDate);
Так как с TSQL я еще на "Вы", помогите, пожалуйста, "ввернуть" в запрос условие, кот. бы проверяло, что pEquip2 тоже != 0. Т.е., если в строке значения в pEquip и pEquip2 равны нулю, строка в запрос не включается.
Заранее спасибо )
12 май 11, 13:36    [10641225]     Ответить | Цитировать Сообщить модератору
 Re: AVG и REPLACEв запросе.  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Integer__,

у Вас же WHERE есть. Вот там условие и добавьте
12 май 11, 13:58    [10641442]     Ответить | Цитировать Сообщить модератору
 Re: AVG и REPLACEв запросе.  [new]
Integer__
Member

Откуда:
Сообщений: 11
iap,

Условием в Where, думаю, не получится решить задачу. Добавила доп. CASE условие. Работает :)

SELECT AVG(CASE WHEN pEquip = 0 THEN (CASE WHEN pEquip2 = 0 THEN pEquip2 END) ELSE pEquip END) FROM pTableName Where (Дата_Время BETWEEN pStartDate AND pEndDate);
12 май 11, 15:27    [10642274]     Ответить | Цитировать Сообщить модератору
 Re: AVG и REPLACEв запросе.  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Integer__
iap,

Условием в Where, думаю, не получится решить задачу. Добавила доп. CASE условие. Работает :)

SELECT AVG(CASE WHEN pEquip = 0 THEN (CASE WHEN pEquip2 = 0 THEN pEquip2 END) ELSE pEquip END) FROM pTableName Where (Дата_Время BETWEEN pStartDate AND pEndDate);
Результат-то от этого зависит!
Как вычисляется AVG()? Считается сумма выражения по всем строкам и делится на количество этих строк.
Что будет, если добавить строки с нулевым значением? Количество строк-то увеличится.
Правильно - среднее значение получится меньше.
Это ведь не то же самое, что "если в строке значения в pEquip и pEquip2 равны нулю, строка в запрос не включается"
12 май 11, 15:35    [10642346]     Ответить | Цитировать Сообщить модератору
 Re: AVG и REPLACEв запросе.  [new]
Integer__
Member

Откуда:
Сообщений: 11
iap,

Да, Вы правы. Вторая функция CASE возвращает NULL, но не меняет число строк.
Спасибо, что помогли разобраться )
12 май 11, 16:04    [10642652]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить