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

Откуда:
Сообщений: 23
Есть таблица продаж "Направление","Регион","Оборот" и отдельно таблица "Регионы". Вопрос как вывести результирующую таблицу в виде Направление, ВСЕ регионы(даже если нет продаж), Оборот. Связь RIGHT JOIN не прокатывает, CROSS JOIN дублирует продажи, как быть???
27 янв 12, 12:09    [11981949]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше соединить 2 таблицы  [new]
Shakill
Member

Откуда: мск
Сообщений: 1887
Andrej_K, что значит "RIGHT JOIN не прокатывает"?
27 янв 12, 12:11    [11981964]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше соединить 2 таблицы  [new]
Baddy
Member

Откуда: Харьков
Сообщений: 174
Andrej_K,

>>Связь RIGHT JOIN не прокатывает
что значит не прокатывет?
27 янв 12, 12:12    [11981968]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше соединить 2 таблицы  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
FROM [таблица продаж] LEFT JOIN Регионы ON [таблица продаж].Регион=Регионы.Регион
27 янв 12, 12:12    [11981976]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше соединить 2 таблицы  [new]
denis2710
Member

Откуда: Москва
Сообщений: 3384
Я может чего-то не понял какой результат нужен то?
Andrej_K
ВСЕ регионы(даже если нет продаж)

Andrej_K
Связь RIGHT JOIN не прокатывает

begin tran

declare @region table ( id int, name varchar(50) )
insert  into @region
        ( id, name )
values  ( 1, 'Region_1' )
          ,
        ( 2, 'Region_2' )
,       ( 3, 'Region_3' )
declare @sales table
  (
    id int identity
  , region_id int
  , Money decimal(10, 2)
  , Napr varchar(50)
  )
insert  into @sales
        ( region_id, Money, Napr )
values  ( 1, 2, 'napr_1' )
                    ,
        ( 1, 2, 'napr_2' )
                    ,
        ( 2, 2, 'napr_3' )
                    ,
        ( 1, 2, 'napr_4' )
select  s.Napr
      , r.name as Region
from    @sales s
left outer join @region r on r.id = s.region_id

select  s.Napr
      , r.name as Region
from    @sales s
right outer join @region r on r.id = s.region_id



rollback
27 янв 12, 12:29    [11982128]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше соединить 2 таблицы  [new]
Andrej_K
Member

Откуда:
Сообщений: 23
Shakill
Andrej_K, что значит "RIGHT JOIN не прокатывает"?


Если у вас продажи по 3 направлениям и 5 регионам, а всего 10 регионов, то надо получить по каждому направлению 10 регионов, причем если продажи были только по 3, остальные должны быть с нулями
27 янв 12, 13:04    [11982490]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше соединить 2 таблицы  [new]
Andrej_K
Member

Откуда:
Сообщений: 23
denis2710
Я может чего-то не понял какой результат нужен то?
Andrej_K
ВСЕ регионы(даже если нет продаж)

Andrej_K
Связь RIGHT JOIN не прокатывает

begin tran

declare @region table ( id int, name varchar(50) )
insert  into @region
        ( id, name )
values  ( 1, 'Region_1' )
          ,
        ( 2, 'Region_2' )
,       ( 3, 'Region_3' )
declare @sales table
  (
    id int identity
  , region_id int
  , Money decimal(10, 2)
  , Napr varchar(50)
  )
insert  into @sales
        ( region_id, Money, Napr )
values  ( 1, 2, 'napr_1' )
                    ,
        ( 1, 2, 'napr_2' )
                    ,
        ( 2, 2, 'napr_3' )
                    ,
        ( 1, 2, 'napr_4' )
select  s.Napr
      , r.name as Region
from    @sales s
left outer join @region r on r.id = s.region_id

select  s.Napr
      , r.name as Region
from    @sales s
right outer join @region r on r.id = s.region_id



rollback


а теперь сделаем группировку по направлению и увидем: там где он не найдет связь по региону - будет красиво('null' и все регионы), а где найдет - направление и регион продажи, а надо все опять повторить, т.е. результат выполнения = декартовому произведению двух таблиц - CROSS JOIN, но он дублирует обороты, там где нет
27 янв 12, 13:18    [11982621]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше соединить 2 таблицы  [new]
Shakill
Member

Откуда: мск
Сообщений: 1887
Andrej_K
Shakill
Andrej_K, что значит "RIGHT JOIN не прокатывает"?


Если у вас продажи по 3 направлениям и 5 регионам, а всего 10 регионов, то надо получить по каждому направлению 10 регионов, причем если продажи были только по 3, остальные должны быть с нулями


так с этого и надо было начинать

select t.Napr, t.name, isnull(s.Money, 0) money
from @sales s
right join (
	select r.id region_id, r.name, ss.napr 
	from @region r
	cross join (
		select distinct napr 
		from @sales s2
	) ss
) t on s.region_id = t.region_id and s.Napr = t.Napr


или это у вас тоже задвоения даёт? тогда данные приведите
27 янв 12, 13:24    [11982674]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше соединить 2 таблицы  [new]
Andrej_K
Member

Откуда:
Сообщений: 23
Shakill
Andrej_K
пропущено...


Если у вас продажи по 3 направлениям и 5 регионам, а всего 10 регионов, то надо получить по каждому направлению 10 регионов, причем если продажи были только по 3, остальные должны быть с нулями


так с этого и надо было начинать

select t.Napr, t.name, isnull(s.Money, 0) money
from @sales s
right join (
	select r.id region_id, r.name, ss.napr 
	from @region r
	cross join (
		select distinct napr 
		from @sales s2
	) ss
) t on s.region_id = t.region_id and s.Napr = t.Napr


или это у вас тоже задвоения даёт? тогда данные приведите


С этим соглашусь, только вот ситуация сложнее, все это работает в сложном отчете, и запрос генерируется автоматически, может быть больше 5 группировок, вот и хотелось как-то таблицу с регионами скрестить уже с результатом запроса(
27 янв 12, 13:33    [11982787]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше соединить 2 таблицы  [new]
Shakill
Member

Откуда: мск
Сообщений: 1887
Andrej_K
С этим соглашусь, только вот ситуация сложнее, все это работает в сложном отчете, и запрос генерируется автоматически, может быть больше 5 группировок, вот и хотелось как-то таблицу с регионами скрестить уже с результатом запроса(


ну так пример с одной группировкой есть, добавьте в подзапрос таких же кроссджойнов сколько надо
27 янв 12, 13:56    [11983099]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше соединить 2 таблицы  [new]
Shakill
Member

Откуда: мск
Сообщений: 1887
Andrej_K, лучше, конечно, не доставать каждый раз список направлений и других группирующих сущностей через distinct из журнала продаж, а держать их в отдельных справочниках
27 янв 12, 14:02    [11983166]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить