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

Откуда:
Сообщений: 79
Здравствуйте. Как реализовать AVG для строк?Преобразовывать строки я могу только в binary. Но дальнейшее обратное преобразование после получения результата avg(binary) к varchar дает пустую строку, что не есть верно.

Возможно, я не там копаю.
Есть два поля, по одному из которых делаю GROUP BY.
В итоге, надо получить только те записи, по которым везде второе поле принимает определенное значение "ЗНАЧЕНИЕ". Я полагал, что с помощью группировки я смогу получить одну строку, в которой результатом avg станет "ЗНАЧЕНИЕ", если все записи по группируемому полю содержат такое значение во втором поле.

Для пояснения приведу пример:
поле1----------поле2
А--------------ЗНАЧЕНИЕ
А--------------NULL
Б--------------ЗНАЧЕНИЕ
Б--------------ЗНАЧЕНИЕ
Б--------------ЗНАЧЕНИЕ

Результатом я бы хотел получить только одну единственную запись: Б. Так как не все строки по поле1="А" содержат поле2="ЗНАЧЕНИЕ".

Есть, конечно, сложное решение через несколько подзапросов с получение кол-ва записей с поле2="ЗНАЧЕНИЕ" и просто кол-во записей по группам поле1 и дальнейшее их слияние/сверка. но хотелось бы более простое решение, если оно есть. Потому и решил попробовать avg.
31 июл 09, 13:10    [7484221]     Ответить | Цитировать Сообщить модератору
 Re: AVG(varchar)  [new]
Glory
Member

Откуда:
Сообщений: 104760
Lunatikus
Здравствуйте. Как реализовать AVG для строк?Преобразовывать строки я могу только в binary. Но дальнейшее обратное преобразование после получения результата avg(binary) к varchar дает пустую строку, что не есть верно.


Хм. А какое среднее должно получиться для значений "Вася", "кирпич" и "молоко", например ?
31 июл 09, 13:13    [7484238]     Ответить | Цитировать Сообщить модератору
 Re: AVG(varchar)  [new]
Glory
Member

Откуда:
Сообщений: 104760
group by a having count(*)=count(distinct b)
31 июл 09, 13:15    [7484251]     Ответить | Цитировать Сообщить модератору
 Re: AVG(varchar)  [new]
Сергей Мишин
Member

Откуда:
Сообщений: 376
Lunatikus
...Результатом я бы хотел получить только одну единственную запись: Б. Так как не все строки по поле1="А" содержат поле2="ЗНАЧЕНИЕ"...


group by поле1
having min(поле2)=max(поле2)
?
31 июл 09, 13:15    [7484253]     Ответить | Цитировать Сообщить модератору
 Re: AVG(varchar)  [new]
Сергей Мишин
Member

Откуда:
Сообщений: 376
точнее так
group by поле1
having min(поле2)=max(поле2) and min(поле2)="ЗНАЧЕНИЕ".
31 июл 09, 13:16    [7484258]     Ответить | Цитировать Сообщить модератору
 Re: AVG(varchar)  [new]
Lunatikus
Member

Откуда:
Сообщений: 79
автор
Хм. А какое среднее должно получиться для значений "Вася", "кирпич" и "молоко", например ?
для меня не имеет значения это. мне важно получить среднее, равное самому значению,т.е. это будет показателем, что во всех строках по группе стоит одно и то же значение, заданное мной.
31 июл 09, 13:16    [7484259]     Ответить | Цитировать Сообщить модератору
 Re: AVG(varchar)  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
select cola, case when colb = 'значение' then colb else null end colb
 from table
 group by cola
 having count(*) = count(case when colb = 'значение' then colb else null end)

для спящего время бодрствования равносильно сну
31 июл 09, 13:17    [7484263]     Ответить | Цитировать Сообщить модератору
 Re: AVG(varchar)  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74927
Lunatikus
для меня не имеет значения это. мне важно получить среднее, равное самому значению,т.е. это будет показателем, что во всех строках по группе стоит одно и то же значение, заданное мной.


Хватит уже этих значений. Приведите DDL на таблицу, образцы данных и желаемый результат.
31 июл 09, 13:18    [7484269]     Ответить | Цитировать Сообщить модератору
 Re: AVG(varchar)  [new]
Lunatikus
Member

Откуда:
Сообщений: 79
автор
group by поле1
having min(поле2)=max(поле2) and min(поле2)="ЗНАЧЕНИЕ".

а если "ЗНАЧЕНИЕ" не будет минимальным? Или максимальным. Другие значения могут быть какими угодно.
31 июл 09, 13:18    [7484270]     Ответить | Цитировать Сообщить модератору
 Re: AVG(varchar)  [new]
Сергей Мишин
Member

Откуда:
Сообщений: 376
Lunatikus
автор
group by поле1
having min(поле2)=max(поле2) and min(поле2)="ЗНАЧЕНИЕ".

а если "ЗНАЧЕНИЕ" не будет минимальным? Или максимальным. Другие значения могут быть какими угодно.

тогда можно БОЛ почитать про GROUP BY, HAVING, MIN, MAX и т.д.
31 июл 09, 13:21    [7484297]     Ответить | Цитировать Сообщить модератору
 Re: AVG(varchar)  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
select cola
 from table
 group by cola
 having count(*) = count(case when colb = 'значение' then colb else null end)
конечно такой запрос.. а не предыдущий.

для спящего время бодрствования равносильно сну
31 июл 09, 13:25    [7484333]     Ответить | Цитировать Сообщить модератору
 Re: AVG(varchar)  [new]
Lunatikus
Member

Откуда:
Сообщений: 79
автор
тогда можно БОЛ почитать про GROUP BY, HAVING, MIN, MAX и т.д.

прочитал. Вы правы, спасибо за помощь.

Glory,спасибо, это тоже можно применить с некоторым дополнением, иначе если у меня будет везде стоять одно и то же значение, но не то, которое мне нужно, я получу некорректные данные.
31 июл 09, 13:29    [7484378]     Ответить | Цитировать Сообщить модератору
 Re: AVG(varchar)  [new]
Lunatikus
Member

Откуда:
Сообщений: 79
Алексей2003, спасибо
31 июл 09, 13:30    [7484384]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить