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

Откуда:
Сообщений: 23
Добрый день, нужна помощь в составление запроса к базе mssql
существует три таблицы

Таблица товарного учета 1
Номер операцииТовар ноКол-во
1 т0001 1
2 т0002 2
3 т0001 1


Таблица финансового учета 2
Номер ОперацииСчет НомерСумма Сумма Дебит Сумма Кредит
1 10-100 100 1000
2 10-999 -1000100
3 41-100 10100
4 41-999 -10010
5 10-200 50500
6 10-999 -50050


Таблица связи товарного учета с финансовым 3

Номер Операции Фин учета Номер Операции Товарного учета
11
21
32
42
53
63

т.е. на одну товарную операцию Всегда приходится две операции финансового учета Дебет и Кредит

Мне необходимо в таблицу товарного учета добавить поля "счет Номер Дебит", "счет номер кредит", "Сумма по фин учету" и заполнить их данными из таблицы Финансового учета, что бы получился следующий результат:

Номер операцииТовар ноКол-воСчет Номер Дебет Счет Номер Кредит Сумма
1 т0001 110-100 10-999 100
2 т0002 2 41-100 41-999 10
3 т0001 1 10-20010-999 50


Записей в таблице связей порядка 3,5 миллионов.

Ума не приложу как подступится к этой задаче, буду благодарен любой помощи.
25 дек 14, 19:47    [17053684]     Ответить | Цитировать Сообщить модератору
 Re: Запрос по объединению твух таблиц через таблицу связи  [new]
HeavyLight
Member

Откуда:
Сообщений: 7
А что если прогонять два раза - сначало записать столбец с четными, потом нечетные.
25 дек 14, 19:59    [17053731]     Ответить | Цитировать Сообщить модератору
 Re: Запрос по объединению твух таблиц через таблицу связи  [new]
Добрый Э - Эх
Guest
Grigoriy123,

PIVOT.
Либо его заменитель на CASE для версий MS SQL Server, не поддерживающих PIVOT
25 дек 14, 20:18    [17053805]     Ответить | Цитировать Сообщить модератору
 Re: Запрос по объединению твух таблиц через таблицу связи  [new]
Grigoriy123
Member

Откуда:
Сообщений: 23
HeavyLight
А что если прогонять два раза - сначало записать столбец с четными, потом нечетные.


вопрос как брать эту четность, если Where (Операци номер mod 2)=0 то не пойдет, т.к. номер операции не последователен.
25 дек 14, 20:21    [17053822]     Ответить | Цитировать Сообщить модератору
 Re: Запрос по объединению твух таблиц через таблицу связи  [new]
Grigoriy123
Member

Откуда:
Сообщений: 23
Добрый Э - Эх,
ковырял PIVOT но не понял ка применить (в примере делали траспонирование строк в столбцы). Если подробней объяснить как, буду благодарен.
25 дек 14, 20:25    [17053831]     Ответить | Цитировать Сообщить модератору
 Re: Запрос по объединению твух таблиц через таблицу связи  [new]
HeavyLight
Member

Откуда:
Сообщений: 7
Grigoriy123,

Берите номер ID, если у вас все так совпадает как в примере, нечет - дебет, чет - кредит, WHERE ID mod 2 = 0.
25 дек 14, 20:45    [17053886]     Ответить | Цитировать Сообщить модератору
 Re: Запрос по объединению твух таблиц через таблицу связи  [new]
HeavyLight
Member

Откуда:
Сообщений: 7
Grigoriy123,

тогда сразу два join делать, один с чет, другой с нечет, если у них есть общие поля для понимания какая операция к какому товару относиться.
25 дек 14, 20:54    [17053923]     Ответить | Цитировать Сообщить модератору
 Re: Запрос по объединению твух таблиц через таблицу связи  [new]
Sekoka
Member

Откуда:
Сообщений: 73
Grigoriy123,

DECLARE @t1  as table ([Номер операции] int,[Товар но] nvarchar(50),[Кол-во] int)
DECLARE @t2  as table ([Номер Операции] int,[Счет Номер] nvarchar(50),[Сумма] int,[Сумма Дебит] int,[Сумма Кредит] int)
DECLARE @t3  as table ([Номер Операции Фин учета] int,[Номер Операции Товарного учета] int)

insert into @t1
VALUES (1,'т0001',1),
(2,'т0002',2),
(3,'т0001',1)

insert into @t2
VALUES (1,'10-100',100,100,0),
(2,'10-999',-100,0,100),
(3,'41-100',10,10,0),
(4,'41-999',-10,0,10),
(5,'10-200',50,50,0),
(6,'10-999',-50,0,50)

insert into @t3
VALUES (1,1),
(2,1),
(3,2),
(4,2),
(5,3),
(6,3)

--1 вариант
SELECT t1.[Номер операции],[Товар но],[Кол-во]
, Дебит=(SELECT [Счет Номер] FROM @t2 WHERE [Номер Операции] in (SELECT [Номер Операции Фин учета] FROM @t3 where [Номер Операции Товарного учета]=t1.[Номер операции]) and [Сумма]>0)
, Кредит=(SELECT [Счет Номер] FROM @t2 WHERE [Номер Операции] in (SELECT [Номер Операции Фин учета] FROM @t3 where [Номер Операции Товарного учета]=t1.[Номер операции]) and [Сумма]<0)
, Сумма=(SELECT [Сумма] FROM @t2 WHERE [Номер Операции] in (SELECT [Номер Операции Фин учета] FROM @t3 where [Номер Операции Товарного учета]=t1.[Номер операции]) and [Сумма]>0)
FROM @t1 as t1

--2 вариант
SELECT [Номер операции],[Товар но],[Кол-во],Дебит=MAX([Дебет]),Кредит=MAX([Кредит]),Сумма=SUM([Сумма]) FROM
(SELECT t1.[Номер операции],[Товар но],[Кол-во],
[Дебет]=case when [Сумма]>0 then [Счет Номер] else NULL end,
[Кредит]=case when [Сумма]<0 then [Счет Номер] else NULL end,
[Сумма]=case when [Сумма]>0 then [Сумма] else 0 end
FROM @t1 as t1
inner join  @t3 as t3 ON t1.[Номер операции]=t3.[Номер Операции Товарного учета]
inner join @t2 as t2 ON t2.[Номер Операции]=t3.[Номер Операции Фин учета]) as t
GROUP BY [Номер операции],[Товар но],[Кол-во]
26 дек 14, 10:40    [17055586]     Ответить | Цитировать Сообщить модератору
 Re: Запрос по объединению твух таблиц через таблицу связи  [new]
Grigoriy123
Member

Откуда:
Сообщений: 23
Sekoka, спасибо большое, ушел тестить и разбираться
26 дек 14, 11:39    [17056024]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить