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

Откуда:
Сообщений: 11
Добрый день!
Я стал заниматься SQL недавно, сейчас столкнулся с трудностью объединения 2-х таблиц.

Таблица А
id
, branch_id
Таблица b
branch_id
, user id

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

На мой не профессиональный взгляд, надо использовать 2 курсора, причем 1 должен быть вложенным
Моей признательности не будет границ за подсказку как быть и что делать)

MS SQL 2005
10 мар 12, 10:28    [12220057]     Ответить | Цитировать Сообщить модератору
 Re: Нужен ли вложенный курсор, помогите разобраться  [new]
invm
Member

Откуда: Москва
Сообщений: 9827
Схему таблиц приведите. А то совершенно не понятно чего, кому и куда присваивать.
10 мар 12, 10:33    [12220062]     Ответить | Цитировать Сообщить модератору
 Re: Нужен ли вложенный курсор, помогите разобраться  [new]
qwerty112
Guest
bai84
Добрый день!
Я стал заниматься SQL недавно, сейчас столкнулся с трудностью объединения 2-х таблиц.

Таблица А
id
, branch_id
Таблица b
branch_id
, user id

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

На мой не профессиональный взгляд, надо использовать 2 курсора, причем 1 должен быть вложенным
Моей признательности не будет границ за подсказку как быть и что делать)

MS SQL 2005

где здесь договор ?

ознакомьтесь - https://www.sql.ru/forum/actualthread.aspx?tid=127456
п.6 - с особым усердием
10 мар 12, 10:42    [12220073]     Ответить | Цитировать Сообщить модератору
 Re: Нужен ли вложенный курсор, помогите разобраться  [new]
bai84
Member

Откуда:
Сообщений: 11
Может не совсем корректно сформулировал вопрос, попробую по другому.
Есть 2 таблице, в одной из которых находится номер договора - id и branch_id -отделение к которому данный договор подвязан (таблица А).
Во второй таблице находятся отделения -branch_id и сотрудники -user id , работающие на отделении. Договора надо дать в обслуживание по одинаковому кол-ву (+-1) сотрудникам работающим на соответственном отделении, как это сделать.


Table a
id branch_id
1 br1
2 br1
3 br1
4 br2
5 br2
6 br2
… ….


Table b
branch_id user id
br1 emp1
br1 emp2
br1 emp3
br1 emp4
br2 emp5
br2 emp6
… …
10 мар 12, 10:43    [12220075]     Ответить | Цитировать Сообщить модератору
 Re: Нужен ли вложенный курсор, помогите разобраться  [new]
invm
Member

Откуда: Москва
Сообщений: 9827
Расшифруйте на уровне таблиц понятие "Договора надо дать в обслуживание".
10 мар 12, 10:52    [12220081]     Ответить | Цитировать Сообщить модератору
 Re: Нужен ли вложенный курсор, помогите разобраться  [new]
bai84
Member

Откуда:
Сообщений: 11
 

-- создание таблицы А
Select
 1 as id
 ,'br1' as branch_id
into Table A

insert into Table A select 2,  'br1'
insert into Table A select 3,  'br1'
insert into Table A select 4,  'br2'
insert into Table A select 5,  'br2'
insert into Table A select 6,  'br2'

-- создание таблицы В
Select
 'br1'	 as branch_id	
 ,'emp1' as user_id
into Table B

insert into Table B select 'br1',  'emp2'
insert into Table B select 'br1',  'emp3'
insert into Table B select 'br1',  'emp4'
insert into Table B select 'br2',  'emp5'
insert into Table B select 'br2',  'emp6'


Необходимо получить результирующую таблицу, содержащую все поля из таблице А и поле "user_id" из табл В

Вид для тестовых данных


ID | branch_id | user_id
1 | br1 | emp1
2 | br1 | emp2
3 | br1 | emp3
4 | br2 | emp5
5 | br2 | emp6
6 | br2 | emp5


Договора должны быть равномерно распределены между сотрудниками соответствующего отделения
10 мар 12, 11:03    [12220099]     Ответить | Цитировать Сообщить модератору
 Re: Нужен ли вложенный курсор, помогите разобраться  [new]
bai84
Member

Откуда:
Сообщений: 11
invm
Расшифруйте на уровне таблиц понятие "Договора надо дать в обслуживание".


У каждой записи из таблицы А должен появится User_id из таблицы В.
10 мар 12, 11:06    [12220109]     Ответить | Цитировать Сообщить модератору
 Re: Нужен ли вложенный курсор, помогите разобраться  [new]
qwerty112
Guest
что-то типа этого
select t1.id, t1.branch_id, t2.user_id
from

(select A.*,
(row_number() over (partition by A.branch_id order by id)) % (select count(*) from B where A.branch_id=B.branch_id)  as xz
from A) t1

inner join

(select B.*,
row_number() over (partition by branch_id order by user_id) % (select count(*) from B B1 where B1.branch_id=B.branch_id) as xz 
from B) t2

on t1.branch_id=t2.branch_id and t1.xz=t2.xz

order by t1.id

id          branch_id user_id
----------- --------- -------
1           br1       emp1
2           br1       emp2
3           br1       emp3
4           br2       emp5
5           br2       emp6
6           br2       emp5

(6 row(s) affected)
10 мар 12, 11:34    [12220153]     Ответить | Цитировать Сообщить модератору
 Re: Нужен ли вложенный курсор, помогите разобраться  [new]
invm
Member

Откуда: Москва
Сообщений: 9827
Как-то так:
declare @c table (contract_id int, branch_id int);
declare @u table (usr_id int, branch_id int);

insert into @c
 select 1, 1 union all
 select 2, 1 union all
 select 3, 1 union all
 select 4, 2 union all
 select 5, 2 union all
 select 6, 2 union all
 select 7, 2 union all
 select 8, 2 union all
 select 9, 2;

insert into @u
 select 1, 1 union all
 select 2, 1 union all
 select 5, 1 union all
 select 3, 2 union all
 select 4, 2;

with uc as
(
 select
  branch_id,
  count(*) as u_Count
 from
  @u
 group by
  branch_id
),
x as
(
 select
  c.contract_id,
  c.branch_id,
  row_number() over (partition by c.branch_id order by newid()) % uc.u_Count + 1 as n
 from
  @c c join
  uc on uc.branch_id = c.branch_id
),
y as 
(
 select
  usr_id,
  branch_id,
  row_number() over (partition by branch_id order by newid()) as n
 from
  @u
)
select
 x.contract_id, x.branch_id, y.usr_id
from
 x join
 y on y.branch_id = x.branch_id and y.n = x.n;
В следующий раз уважайте тех, у кого просите помощи и не заставляйте их за вас подготоваливать тестовые данные.
10 мар 12, 11:38    [12220158]     Ответить | Цитировать Сообщить модератору
 Re: Нужен ли вложенный курсор, помогите разобраться  [new]
bai84
Member

Откуда:
Сообщений: 11
Большое спасибо за ответ! Простите за данные, буду сидеть и разбираться
10 мар 12, 12:49    [12220313]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить