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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.09.2009, 14:13   #1
eda
Пользователь
 
Регистрация: 14.08.2008
Сообщений: 78
По умолчанию CROSSTAB

Здравствуйте! Расскажите, пожалуйста, что такое crosstab и как им пользоваться. Или дайте, пожалуйста, дельные ссылки.
Имеется таблица, состоящая из двух столбцов: name, sum. В столбце sum есть положительные величины, есть отрицательные, для каждого name. Задача состоит в том, чтобы запросом вытащить данные со след структурой: name, `+`, `-`. Подскажите, пожалуйста, что-нибудь. Спасибо!
eda вне форума Ответить с цитированием
Старый 14.09.2009, 15:00   #2
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

какая субд?
приведите пример исходных данных и то что хотите увидеть
просто неясно - в колонки "+" и "-" нужно суммировать соответственно все + и -?

апд
ладно, пока автор в раздумьях налабал тестовый примерчик
Код:
with 
  t as
  (select 'aaaaaa' name, 100 i_sum from dual union all
   select 'aaaaaa', -100 from dual union all
   select 'baaa', 100 from dual union all
   select 'ccccc', -100 from dual union all
   select 'ccccc', -200 from dual union all
   select 'dd', 100 from dual union all
   select 'dd', 100 from dual union all
   select 'eee', -100 from dual union all
   select 'eee', -100 from dual
  )

select 
  name,
  sum(f1) "+",
  sum(f2) "-"
from(
select
  name,
  case 
  when i_sum>0 then i_sum
  else 0 end f1,
  case 
  when i_sum<0 then i_sum
  else 0 end f2
from t)
group by name

Последний раз редактировалось soleil@mmc; 14.09.2009 в 15:09.
soleil@mmc вне форума Ответить с цитированием
Старый 14.09.2009, 15:15   #3
eda
Пользователь
 
Регистрация: 14.08.2008
Сообщений: 78
По умолчанию

Mysql
исходные данные:

name sum

иванов 9
петров -5
сидоров 3
иванов -4
сидоров -7
петров 6

Нужно получить:

name `+` `-`

иванов 9 -4
петров 6 -5
сидоров 3 -7

Последний раз редактировалось eda; 14.09.2009 в 15:18.
eda вне форума Ответить с цитированием
Старый 14.09.2009, 15:27   #4
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

запрос в посте выше
"селект фром селект" у вас работает?
если нет, то пишите вьюху с внутренним запросом и внешний запрос делайте из вьюхи
soleil@mmc вне форума Ответить с цитированием
Старый 14.09.2009, 15:41   #5
eda
Пользователь
 
Регистрация: 14.08.2008
Сообщений: 78
По умолчанию

селект не работает. можно подробнее по поводу вьюхи?
Спасибо!
eda вне форума Ответить с цитированием
Старый 14.09.2009, 15:52   #6
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

Цитата:
Сообщение от eda Посмотреть сообщение
селект не работает. можно подробнее по поводу вьюхи?
Спасибо!
создаете вьюху (название полей и таблицы подставите свои)
Код:
create view v$crosstab
as
select
  name,
  case 
  when i_sum>0 then i_sum
  else 0 end f1,
  case 
  when i_sum<0 then i_sum
  else 0 end f2
from t
и далее ваш запрос будет таким
Код:
select 
  name,
  sum(f1) "+",
  sum(f2) "-"
from v$crosstab
group by name
soleil@mmc вне форума Ответить с цитированием
Старый 17.09.2009, 16:09   #7
eda
Пользователь
 
Регистрация: 14.08.2008
Сообщений: 78
По умолчанию

Спасибо большое! все работает!
eda вне форума Ответить с цитированием
Ответ


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