Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Подскажите, как лучше оформить SQL-запрос  [new]
Alibek B.
Member

Откуда:
Сообщений: 3721
Есть одна информационная система с базой данных. В базе данных хранится информация по клиентам и услугам, отношение 1:M (у одного клиента может быть несколько услуг), но в 99% одному клиенту соответствует одна услуга.
У клиентов есть различные атрибуты (хранятся в дополнительной таблице, отношение 1:M), у услуг тоже есть разные атрибуты (в основном хранятся таблице услуг, но некоторые хранятся в дополнительной таблице с отношением 1:M).
В информационной системе есть поиск клиентов, в результатах поиска выводится таблица с атрибутами клиентов.
Я хочу выводить в результаты запросов информацию по услугам; если одному клиенту соответствует одна услуга, то выводить непосредственно атрибуты этой услуги, если одному клиенту соответствует несколько услуг, то выводить информацию через запятую или суммарную статистику.
Примерно так (интресует столбец Статус):
КлиентТелефонБалансСтатус
Петров111-22-33100Услуга активна, оплачена до 01.01.2014
Иванов111-22-33200Услуга активна, оплачена до 01.01.2013
Сидоров111-22-330Услуг активно: 1, неактивно: 3


Как можно в SQL-запросе оформить условие "если есть одна подчиненная запись, то join ..., иначе join ..."?
________________________
Мы смотрим с оптимизмом...
...в оптический прицел.
20 июл 12, 16:26    [12894293]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите, как лучше оформить SQL-запрос  [new]
Alibek B.
Member

Откуда:
Сообщений: 3721
Можно сделать обычный джойн с услугами, а потом добавить группировку по всем полям, относящимся к клиенту.
Но полей довольно много и хотелось бы этого избежать (чтобы не ошибиться, когда буду править формы и шаблоны информационной системы).
20 июл 12, 16:28    [12894305]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите, как лучше оформить SQL-запрос  [new]
Ramin Hashimzade
Member

Откуда: Азербайджан, Баку
Сообщений: 9979
Блог
Alibek B.,

как я понял тебя нужно:

with cus(id,nm) as
 (select 1, 'Петров'
    from dual
  union all
  select 2, 'Иванов' from dual),
pr(pr_id,cus_id,status) as
 (select 1, 1, 'mystat1'
    from dual
  union all
  select 2, 1, 'mystat2'
    from dual
  union all
  select 3, 2, 'mystat1' from dual)
select c.id, c.nm, decode(p.cnt, 1, p.status, 'количество:'||p.cnt)
  from cus c
  join (select p.*,
               count(*) over(partition by p.cus_id order by 1) as cnt
          from pr p) p
    on p.cus_id = c.id
group by c.id, c.nm, decode(p.cnt, 1, p.status, 'количество:'||p.cnt)


но группировка есть и не понял что трудного? если не мешает используй distinct
20 июл 12, 16:58    [12894451]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить