Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.08.2009, 15:01   #1
acidcool
Пользователь
 
Регистрация: 13.08.2009
Сообщений: 19
По умолчанию Среднее значение

Есть таблица с датами и значениями для каждой даты. Но! Для некоторых дат есть несколько значений, а вывести надо без повторений. Например, есть значения:

2009-06-15 | 2
2009-06-16 | 9
2009-06-16 | 4
2009-06-16 | 11
2009-06-17 | 5

А надо:

2009-06-15 | 2
2009-06-16 | 8
2009-06-17 | 5

Как????
acidcool вне форума Ответить с цитированием
Старый 13.08.2009, 15:13   #2
TAVulator
Программист
Форумчанин
 
Аватар для TAVulator
 
Регистрация: 23.07.2009
Сообщений: 101
По умолчанию

сумма значений в одинаковых датах поделить на количество повторов этой даты.
Если вы верите, что можете или не можете
сделать что-то, вы правы в обоих случаях.

______________________________(С) Г.Форд
TAVulator вне форума Ответить с цитированием
Старый 13.08.2009, 15:34   #3
acidcool
Пользователь
 
Регистрация: 13.08.2009
Сообщений: 19
По умолчанию

Это я понимаю. Как написать запрос так, чтобы он выдавал сразу среднее значение?
acidcool вне форума Ответить с цитированием
Старый 13.08.2009, 16:38   #4
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

Код:
select
  field_date,
  avg(field_value) field_value
from your_table
group by field_date
soleil@mmc вне форума Ответить с цитированием
Старый 14.08.2009, 08:38   #5
acidcool
Пользователь
 
Регистрация: 13.08.2009
Сообщений: 19
По умолчанию

Большое спасибо!

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

2009-07-15 | 2
2009-07-16 | 3
2009-07-18 | 5

А надо, чтоб выводил:

2009-07-15 | 2
2009-07-16 | 3
2009-07-17 | 0
2009-07-18 | 5

Как?

Последний раз редактировалось Stilet; 14.08.2009 в 11:46.
acidcool вне форума Ответить с цитированием
Старый 14.08.2009, 10:02   #6
BARNEY
Участник клуба
 
Регистрация: 23.04.2009
Сообщений: 1,058
По умолчанию

копай в сторону case
Если вам человек помог, не стесняйтесь говорить спасибо (весы под аватаром)
BARNEY вне форума Ответить с цитированием
Старый 14.08.2009, 11:35   #7
Wicort
Форумчанин
 
Аватар для Wicort
 
Регистрация: 04.08.2009
Сообщений: 684
По умолчанию

Код:
select
  field_date,
  CASE WHEN avg(field_value) IS NOT NULL THEN avg(field_value) ELSE 0 END field_value
from your_table
group by field_date
может быть так
Еслия Вам помог, не поленитесь нажать на весы и оставить отзыв. Это не займет много времени, но даст понять, что я старался не зря =)
Мой ник зарегистрирован, а твой?
Wicort вне форума Ответить с цитированием
Старый 14.08.2009, 11:43   #8
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

Цитата:
Сообщение от Wicort Посмотреть сообщение
Код:
select
  field_date,
  CASE WHEN avg(field_value) IS NOT NULL THEN avg(field_value) ELSE 0 END field_value
from your_table
group by field_date
может быть так
этот запрос не добавит новую строчку если есть пробел в датах

2 acidcool
а какая субд?

вот накидал для Оракла
Код:
with t
as
  (select to_date('07.08.2009', 'DD.MM.YYYY') i_date, 2 i_value from dual union all
   select to_date('10.08.2009', 'DD.MM.YYYY'), 9 from dual union all
   select to_date('10.08.2009', 'DD.MM.YYYY'), 4 from dual union all
   select to_date('10.08.2009', 'DD.MM.YYYY'), 11 from dual union all
   select to_date('11.08.2009', 'DD.MM.YYYY'), 3 from dual union all
   select to_date('11.08.2009', 'DD.MM.YYYY'), 7 from dual union all
   select to_date('12.08.2009', 'DD.MM.YYYY'), 9 from dual union all
   select to_date('13.08.2009', 'DD.MM.YYYY'), 8 from dual union all
   select to_date('15.08.2009', 'DD.MM.YYYY'), 9 from dual union all
   select to_date('17.08.2009', 'DD.MM.YYYY'), 10 from dual
   ),

t2
as
  (select 
    (select min(i_date) from t) + (level - 1) i_date2   
   from dual
   connect by level <= (select max(i_date) - min(i_date) + 1 from t)
  )

select
  i_date2,
  nvl(avg(i_value), 0) i_value
from t2, t
where t.i_date(+) = t2.i_date2
group by i_date2
order by i_date2
суть такая - нужно получить независимый набор данных в виде полной последовательности дат за искомый период
и дальше через внешнее объединение сравнить наборы данных

Последний раз редактировалось soleil@mmc; 14.08.2009 в 12:08.
soleil@mmc вне форума Ответить с цитированием
Старый 14.08.2009, 12:30   #9
acidcool
Пользователь
 
Регистрация: 13.08.2009
Сообщений: 19
По умолчанию

Спасибо за Оракл. Но у меня MySQL.
acidcool вне форума Ответить с цитированием
Старый 14.08.2009, 12:45   #10
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

Цитата:
Сообщение от acidcool Посмотреть сообщение
Спасибо за Оракл. Но у меня MySQL.
поищите как на мускуле реализовать "pivot" (хотя это в оракловом сленге так прижился вариант многострочного дуала)

или создайте табличку и заполните ее в цикле на 20..100 лет вперед данными с датами каждого дня (create table pivot(i_date date); )
и тогда запрос будет проще (заодно nvl заменим на case)
Код:
select
  t2.i_date,
  case 
  when avg(t.i_value) is null then 0
  else avg(t.i_value) end i_value
from 
  pivot t2, 
  t
where 0=0
   and t.i_date(+) = t2.i_date2
   and t2.i_date < (select max(i_date) + 1 from t)
   and t2.i_date >= (select min(i_date) from t)
group by t2.i_date
order by t2.i_date
outer join сами прикрутите

Последний раз редактировалось soleil@mmc; 14.08.2009 в 13:32.
soleil@mmc вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Среднее значение столбца ruavia3 Microsoft Office Excel 1 09.05.2009 19:01
как посчитать среднее арифметическое значение CraZZy RabbIt Общие вопросы Delphi 5 14.03.2009 13:59
среднее значение MyQwErTy Паскаль, Turbo Pascal, PascalABC.NET 3 09.11.2008 21:17
среднее значение tonic Microsoft Office Excel 1 04.01.2008 00:20