Имя: Пароль:
1C
 
Соединить 2 таблицы в запросе
0 iogann1691
 
02.02.17
11:34
Всем доброго времени суток.

Нужно соединить 2 таблицы в запросе, т.е.
1-ая таблица
|Работник|Начисление|СуммаНачисление
|Иванов  |Оклад     |15000

2-ая таблица
|Работник|Удержание|СуммаУдержание
|Иванов  |ОПВ      |1500
|Иванов  |ИПН      |1200

Нужно чтобы получилось
|Работник|Начисление|Удержание|СуммаНачисление|СуммаУдержание
|Иванов  |Оклад     |ОПВ      |15000          |1500
|Иванов  |          |ИПН      |               |1200

Нужно именно в запросе, делаю на СКД, постобработку не предлагать
1 Ёпрст
 
02.02.17
11:39
А почему, не так, например ?


|Работник|Начисление|Удержание|СуммаНачисление|СуммаУдержание
|Иванов  |Оклад     |ИПН      |15000          |1200
|Иванов  |          |ОПВ      |               |1500
2 Ёпрст
 
02.02.17
11:40
По какому принципу будешь "скрещивать" ?

Так-то, обычным юнионом у тебя только так выйдет:

|Работник|Начисление|Удержание|СуммаНачисление|СуммаУдержание
|Иванов  |Оклад     |         |15000          |
|Иванов  |          |ОПВ      |               |1500
|Иванов  |          |ИПН      |               |1200
3 Defender aka LINN
 
02.02.17
11:41
Нужно - делай. Мы не возражаем.
4 iogann1691
 
02.02.17
11:41
(1) (2) так вот и я про то же, поэтому и пришел за помощью
5 Жан Пердежон
 
02.02.17
11:41
Предлагаю так:
|Работник|Начисление/Удержание|Сумма
|Иванов  |Оклад    |15000
|Иванов  |ИПН      |-1500
|Иванов  |ОПВ      |-1200
6 mkalimulin
 
02.02.17
11:42
(0) Тут вам без нумерации строк таблицы не обойтись.
Еще эта задача называется "накопительный итог в запросе".
Поищите примеры решения.
Пользуйтесь конструктором JUG.
http://catalog.mista.ru/public/569569/
Там есть библиотека шаблонов и этот случай тоже.
7 iogann1691
 
02.02.17
11:43
(5) так не пойдет, т.к. СКД с размеченными областями, чтобы было понятнее принцип расчетного листка
Начисления| Удержания
Оклад     | ОПВ
          | ИПН
8 Жан Пердежон
 
02.02.17
11:45
Добавь колонку с номером и по нему соединяй
9 iogann1691
 
02.02.17
11:46
(8) вариант, сейчас попробую
10 AlexTim03
 
02.02.17
11:48
Объединение таблиц + группировка.
Все.
11 AlexTim03
 
02.02.17
11:50
выбрать
Работник,
Начисления,
СуммаНачисления,
Неопределено КАК Удержания,
0 КАК СуммаУдержания

объединить

Работник,
Неопределено
0,
Удержания,
СуммаУдержания
12 iogann1691
 
02.02.17
11:50
(10) (11)
ВЫБРАТЬ
    ВложенныйЗапрос.Работник КАК Работник,
    ВложенныйЗапрос.ВидРасчетаНачисление КАК ВидРасчетаНачисление,
    ВложенныйЗапрос.РазмерНачисление КАК РазмерНачисление,
    ВложенныйЗапрос.СуммаНачисление КАК СуммаНачисление,
    ВложенныйЗапрос.ВидРасчетаУдержание КАК ВидРасчетаУдержание,
    ВложенныйЗапрос.РазмерУдержание КАК РазмерУдержание,
    ВложенныйЗапрос.СуммаУдержание КАК СуммаУдержание
ИЗ
    (ВЫБРАТЬ
        АВВзаиморасчетыСРаботникамиУчрежденийОбороты.Работник КАК Работник,
        АВВзаиморасчетыСРаботникамиУчрежденийОбороты.ВидРасчета КАК ВидРасчетаНачисление,
        АВВзаиморасчетыСРаботникамиУчрежденийОбороты.РазмерПриход КАК РазмерНачисление,
        АВВзаиморасчетыСРаботникамиУчрежденийОбороты.СуммаВзаиморасчетаПриход КАК СуммаНачисление,
        NULL КАК ВидРасчетаУдержание,
        NULL КАК РазмерУдержание,
        NULL КАК СуммаУдержание
    ИЗ
        РегистрНакопления.АВВзаиморасчетыСРаботникамиУчреждений.Обороты(, , , ВидОперации = ЗНАЧЕНИЕ(Перечисление.АВВидыОперацийВзаиморасчетов.Начисление)) КАК АВВзаиморасчетыСРаботникамиУчрежденийОбороты
    
    ОБЪЕДИНИТЬ
    
    ВЫБРАТЬ
        АВВзаиморасчетыСРаботникамиУчрежденийОбороты.Работник,
        NULL,
        NULL,
        NULL,
        АВВзаиморасчетыСРаботникамиУчрежденийОбороты.ВидРасчета,
        АВВзаиморасчетыСРаботникамиУчрежденийОбороты.РазмерПриход,
        АВВзаиморасчетыСРаботникамиУчрежденийОбороты.СуммаВзаиморасчетаПриход
    ИЗ
        РегистрНакопления.АВВзаиморасчетыСРаботникамиУчреждений.Обороты(, , , ВидОперации = ЗНАЧЕНИЕ(Перечисление.АВВидыОперацийВзаиморасчетов.Удержание)) КАК АВВзаиморасчетыСРаботникамиУчрежденийОбороты) КАК ВложенныйЗапрос

УПОРЯДОЧИТЬ ПО
    Работник
АВТОУПОРЯДОЧИВАНИЕ
13 mkalimulin
 
02.02.17
11:50
(11) Продолжай.
14 iogann1691
 
02.02.17
11:51
(12) так не работает
15 Жан Пердежон
 
02.02.17
11:52
(14) ясен пень, в (10) (11) херню насоветовали
16 iogann1691
 
02.02.17
12:25
(15) получилось так же как и в (12)
ВЫБРАТЬ
    АВВзаиморасчетыСРаботникамиУчрежденийОбороты.Работник КАК Работник,
    1 КАК НомерСтроки
ПОМЕСТИТЬ ВТ_НомераНачисления
ИЗ
    РегистрНакопления.АВВзаиморасчетыСРаботникамиУчреждений.Обороты(, , , ВидОперации = ЗНАЧЕНИЕ(Перечисление.АВВидыОперацийВзаиморасчетов.Начисление)) КАК АВВзаиморасчетыСРаботникамиУчрежденийОбороты
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    АВВзаиморасчетыСРаботникамиУчрежденийОбороты.Работник КАК Работник,
    1 КАК НомерСтроки
ПОМЕСТИТЬ ВТ_НомераУдержания
ИЗ
    РегистрНакопления.АВВзаиморасчетыСРаботникамиУчреждений.Обороты(, , , ВидОперации = ЗНАЧЕНИЕ(Перечисление.АВВидыОперацийВзаиморасчетов.Удержание)) КАК АВВзаиморасчетыСРаботникамиУчрежденийОбороты
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    АВВзаиморасчетыСРаботникамиУчрежденийОбороты.Работник КАК Работник,
    СУММА(ВТ_НомераНачисления.НомерСтроки) КАК НомерСтроки,
    АВВзаиморасчетыСРаботникамиУчрежденийОбороты.ВидРасчета КАК ВидРасчета,
    АВВзаиморасчетыСРаботникамиУчрежденийОбороты.РазмерПриход КАК РазмерПриход,
    АВВзаиморасчетыСРаботникамиУчрежденийОбороты.СуммаВзаиморасчетаПриход КАК СуммаВзаиморасчетаПриход
ПОМЕСТИТЬ ВТ_Начисления
ИЗ
    РегистрНакопления.АВВзаиморасчетыСРаботникамиУчреждений.Обороты(, , , ВидОперации = ЗНАЧЕНИЕ(Перечисление.АВВидыОперацийВзаиморасчетов.Начисление)) КАК АВВзаиморасчетыСРаботникамиУчрежденийОбороты
        ЛЕВОЕ СОЕДИНЕНИЕ ВТ_НомераНачисления КАК ВТ_НомераНачисления
        ПО АВВзаиморасчетыСРаботникамиУчрежденийОбороты.Работник <= ВТ_НомераНачисления.Работник

СГРУППИРОВАТЬ ПО
    АВВзаиморасчетыСРаботникамиУчрежденийОбороты.Работник,
    АВВзаиморасчетыСРаботникамиУчрежденийОбороты.ВидРасчета,
    АВВзаиморасчетыСРаботникамиУчрежденийОбороты.РазмерПриход,
    АВВзаиморасчетыСРаботникамиУчрежденийОбороты.СуммаВзаиморасчетаПриход
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    АВВзаиморасчетыСРаботникамиУчрежденийОбороты.Работник КАК Работник,
    СУММА(ВТ_НомераУдержания.НомерСтроки) КАК НомерСтроки,
    АВВзаиморасчетыСРаботникамиУчрежденийОбороты.ВидРасчета КАК ВидРасчета,
    АВВзаиморасчетыСРаботникамиУчрежденийОбороты.РазмерПриход КАК РазмерПриход,
    АВВзаиморасчетыСРаботникамиУчрежденийОбороты.СуммаВзаиморасчетаПриход КАК СуммаВзаиморасчетаПриход
ПОМЕСТИТЬ ВТ_Удержания
ИЗ
    РегистрНакопления.АВВзаиморасчетыСРаботникамиУчреждений.Обороты(, , , ВидОперации = ЗНАЧЕНИЕ(Перечисление.АВВидыОперацийВзаиморасчетов.Удержание)) КАК АВВзаиморасчетыСРаботникамиУчрежденийОбороты
        ЛЕВОЕ СОЕДИНЕНИЕ ВТ_НомераУдержания КАК ВТ_НомераУдержания
        ПО АВВзаиморасчетыСРаботникамиУчрежденийОбороты.Работник <= ВТ_НомераУдержания.Работник

СГРУППИРОВАТЬ ПО
    АВВзаиморасчетыСРаботникамиУчрежденийОбороты.Работник,
    АВВзаиморасчетыСРаботникамиУчрежденийОбороты.ВидРасчета,
    АВВзаиморасчетыСРаботникамиУчрежденийОбороты.РазмерПриход,
    АВВзаиморасчетыСРаботникамиУчрежденийОбороты.СуммаВзаиморасчетаПриход
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВТ_Начисления.Работник КАК Работник,
    ВТ_Начисления.НомерСтроки КАК НомерСтроки,
    ВТ_Начисления.ВидРасчета КАК ВидРасчета,
    ВТ_Начисления.РазмерПриход КАК РазмерПриход,
    ВТ_Начисления.СуммаВзаиморасчетаПриход КАК СуммаВзаиморасчетаПриход,
    ВТ_Удержания.ВидРасчета КАК ВидРасчета1,
    ВТ_Удержания.РазмерПриход КАК РазмерПриход1,
    ВТ_Удержания.СуммаВзаиморасчетаПриход КАК СуммаВзаиморасчетаПриход1
ИЗ
    ВТ_Начисления КАК ВТ_Начисления
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_Удержания КАК ВТ_Удержания
        ПО ВТ_Начисления.НомерСтроки = ВТ_Удержания.НомерСтроки
17 mkalimulin
 
02.02.17
12:43
(16) Я же говорю - номера генерить надо. Взял первую таблицу, пронумеровал. Взял вторую таблицу, пронумеровал.
18 iogann1691
 
02.02.17
12:50
(17) предлагаете нумеровать строки по видам расчета?
19 Ёпрст
 
02.02.17
12:51
(18) нумеровать нужно по работничку, потом соединение по работничку и по этому нумеру.
20 iogann1691
 
02.02.17
12:56
(19) так я и пронумеровал по работничку в (16)
21 mkalimulin
 
02.02.17
12:59
(20) Неправильно пронумеровали.
22 iogann1691
 
02.02.17
13:00
(21) готов принять поправку
23 mkalimulin
 
02.02.17
13:03
(22) Долго объяснять. Посмотрите пример решения задачи "накопительный итог в запросе". Это ваш случай.
24 Ёпрст
 
02.02.17
13:03
(20) в каком месте ? Присвоив всем работникам одинаковый номер в виде единички ?
25 iogann1691
 
02.02.17
13:07
(24) где вы там одинаковый номер видели?
26 Ёпрст
 
02.02.17
13:08
(25)
1 КАК НомерСтроки
27 iogann1691
 
02.02.17
13:09
(26) а как же далее?
СУММА(ВТ_НомераНачисления.НомерСтроки) КАК НомерСтроки,
....
ЛЕВОЕ СОЕДИНЕНИЕ ВТ_НомераНачисления КАК ВТ_НомераНачисления
        ПО АВВзаиморасчетыСРаботникамиУчрежденийОбороты.Работник <= ВТ_НомераНачисления.Работник
28 iogann1691
 
02.02.17
13:09
(26) очень даже нумеруются работники, старый, давно рабочий пример
29 Ёпрст
 
02.02.17
13:10
(27) Далее не смотрел, ибо не интересно
30 Ёпрст
 
02.02.17
13:12
Ибо последний запрос не верный, там где иннер джоин у тебя
31 Ёпрст
 
02.02.17
13:12
ибо таким образом ты херишь строки, где удержаний или начислений больше.. ты оставляешь только совпадения по номеру строки.
32 iogann1691
 
02.02.17
13:14
допустим это будет так:
ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_Удержания КАК ВТ_Удержания
        ПО (ВТ_Начисления.Работник = ВТ_Удержания.Работник
                И ВТ_Начисления.НомерСтроки = ВТ_Удержания.НомерСтроки)
все равно тот же результат
33 Ёпрст
 
02.02.17
13:25
(32) Допустим, это не верно, см. (31)
34 iogann1691
 
02.02.17
15:40
(33) не спорю, раз неверно отрабатывает
35 Ёпрст
 
02.02.17
15:58
(34) И ? Мыслей нема, что ле ?

ЕстьNULL(ВТ_Начисления.Работник,ВТ_Удержания.Работник) КАК Работник,

......

Полное Соединение ВТ_Удержания КАК ВТ_Удержания
        ПО (ВТ_Начисления.Работник = ВТ_Удержания.Работник

                И ВТ_Начисления.НомерСтроки = ВТ_Удержания.НомерСтроки)
36 iogann1691
 
03.02.17
13:51
(35) (21) (15)
всем спасибо, получилось вот так:
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВТ_Начисления.ВидРасчета КАК ВидРасчетаНачисление,
    ВТ_Начисления.Работник КАК РаботникНачисление,
    КОЛИЧЕСТВО(ВТ_Начисления1.ВидРасчета) КАК НомерСтрокиНачисление,
    ВТ_Начисления.РазмерПриход КАК РазмерНачисление,
    ВТ_Начисления.СуммаВзаиморасчетаПриход КАК СуммаНачисление
ПОМЕСТИТЬ ВТ_НумерованныеНачисления
ИЗ
    ВТ_Начисления КАК ВТ_Начисления
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_Начисления КАК ВТ_Начисления1
        ПО ВТ_Начисления.ВидРасчета.Наименование >= ВТ_Начисления1.ВидРасчета.Наименование
            И ВТ_Начисления.Работник = ВТ_Начисления1.Работник

СГРУППИРОВАТЬ ПО
    ВТ_Начисления.ВидРасчета,
    ВТ_Начисления.Работник,
    ВТ_Начисления.РазмерПриход,
    ВТ_Начисления.СуммаВзаиморасчетаПриход
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВТ_Удержания.ВидРасчета КАК ВидРасчетаУдержание,
    ВТ_Удержания.Работник КАК РаботникУдержание,
    КОЛИЧЕСТВО(ВТ_Удержания1.ВидРасчета) КАК НомерСтрокиУдержание,
    ВТ_Удержания.РазмерПриход КАК РазмерУдержание,
    ВТ_Удержания.СуммаВзаиморасчетаПриход КАК СуммаУдержание
ПОМЕСТИТЬ ВТ_НумерованныеУдержания
ИЗ
    ВТ_Удержания КАК ВТ_Удержания
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_Удержания КАК ВТ_Удержания1
        ПО ВТ_Удержания.ВидРасчета.Наименование >= ВТ_Удержания1.ВидРасчета.Наименование
            И ВТ_Удержания.Работник = ВТ_Удержания1.Работник

СГРУППИРОВАТЬ ПО
    ВТ_Удержания.ВидРасчета,
    ВТ_Удержания.Работник,
    ВТ_Удержания.РазмерПриход,
    ВТ_Удержания.СуммаВзаиморасчетаПриход
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВТ_НумерованныеНачисления.НомерСтрокиНачисление КАК НомерСтрокиНачисление,
    ВТ_НумерованныеНачисления.РаботникНачисление КАК РаботникНачисление,
    ВТ_НумерованныеНачисления.ВидРасчетаНачисление,
    ВТ_НумерованныеНачисления.РазмерНачисление,
    ВТ_НумерованныеНачисления.СуммаНачисление,
    ВТ_НумерованныеУдержания.НомерСтрокиУдержание,
    ВТ_НумерованныеУдержания.ВидРасчетаУдержание,
    ВТ_НумерованныеУдержания.РазмерУдержание,
    ВТ_НумерованныеУдержания.СуммаУдержание
ИЗ
    ВТ_НумерованныеНачисления КАК ВТ_НумерованныеНачисления
        ПОЛНОЕ СОЕДИНЕНИЕ ВТ_НумерованныеУдержания КАК ВТ_НумерованныеУдержания
        ПО ВТ_НумерованныеНачисления.РаботникНачисление = ВТ_НумерованныеУдержания.РаботникУдержание
            И ВТ_НумерованныеНачисления.НомерСтрокиНачисление = ВТ_НумерованныеУдержания.НомерСтрокиУдержание

УПОРЯДОЧИТЬ ПО
    РаботникНачисление,
    НомерСтрокиНачисление


может кому пригодится
37 DrZombi
 
гуру
03.02.17
14:19
(36) Спасибо, но мы как то без этого ужаса :)
38 Ёпрст
 
03.02.17
14:31
(36) см. (35) - у тебя у половины строк, может не оказаться работничка и других реквизитов при полном соединении, нужно ЕстьNULL втыкать из двух табличек в селекте.
39 iogann1691
 
04.02.17
07:32
(38) точно, спасибо, воспользовался ЕСТЬNULL  и все гуд
Основная теорема систематики: Новые системы плодят новые проблемы.