Опять запрос

Renat11111

Well-Known Member
20.04.2008
123
0
#1
Опять элементарная проблема с запросом. очень туго поддаюсь процессу обучения )))

из таблицы Документ.ЗарплатаКВыплатеОрганизаций.РаботникиОрганизации КАК Основной нужны мне все сотрудники, а таблицу
|ЛЕВОЕ СОЕДИНЕНИЕ Документ.ЗарплатаКВыплатеОрганизаций.РаботникиОрганизации КАК ЗарплатаВыплачена использую для того чтобы
получить сумму ВыплаченностьЗарплаты = &Выплачено.
тоесть имеем например 10 сотрудников с общей суммой 20000
из них токо у 9 ВыплаченностьЗарплаты = &Выплачено.
вроде и понимаю я что своим условием соединения отсекаю одного сотрудника у меня выбирает 9 сотрудников
|И ЗарплатаВыплачена.ВыплаченностьЗарплаты = &Выплачено
Но ниче придумать не могу.

|ВЫБРАТЬ
| Основной.НомерСтроки КАК НомерСтроки,
| Основной.Сотрудник.ФизЛицо КАК СсылкаФизЛицо,
| Основной.НомерКарточки КАК НомерКарточки,
| ВЫБОР КОГДА (ФИОФизЛицСрезПоследних.Фамилия) ЕСТЬ NULL
| ТОГДА Основной.Сотрудник.Физлицо.Наименование
| ИНАЧЕ ФИОФизЛицСрезПоследних.Фамилия + "" "" + ФИОФизЛицСрезПоследних.Имя + "" "" + ФИОФизЛицСрезПоследних.Отчество
| КОНЕЦ КАК ФизЛицо,
| ВЫБОР КОГДА Основной.ВыплаченностьЗарплаты = ЗНАЧЕНИЕ(Перечисление.ВыплаченностьЗарплаты.Задепонировано)
| ТОГДА ""Задепонировано""
| ИНАЧЕ """"
| КОНЕЦ КАК ЗаписьОДепонировании,
| Основной.Сотрудник.Код КАК ТабельныйНомер,
| СУММА(Основной.Сумма) КАК СУММА,
| СУММА(ЗарплатаВыплачена.Сумма) КАК СуммаОплачено
|ИЗ Документ.ЗарплатаКВыплатеОрганизаций.РаботникиОрганизации КАК Основной
|
|ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ФИОФизЛиц.СрезПоследних(&ДатаДокумента, Физлицо В (ВЫБРАТЬ РАЗЛИЧНЫЕ Основной.Сотрудник.Физлицо КАК Физлицо ИЗ Документ.ЗарплатаКВыплатеОрганизаций.РаботникиОрганизации КАК Основной ГДЕ Основной.Ссылка = &ДокументСсылка )) КАК ФИОФизЛицСрезПоследних
|ПО Основной.Сотрудник.Физлицо = ФИОФизЛицСрезПоследних.ФизЛицо
|ЛЕВОЕ СОЕДИНЕНИЕ Документ.ЗарплатаКВыплатеОрганизаций.РаботникиОрганизации КАК ЗарплатаВыплачена
|ПО Основной.Сотрудник.Физлицо= ЗарплатаВыплачена.Сотрудник.Физлицо
|И ЗарплатаВыплачена.ВыплаченностьЗарплаты = &Выплачено
|ГДЕ Основной.Ссылка = &ДокументСсылка
| И Основной.СпособВыплаты = &ЧерезБанк
| И Основной.Банк = &Банк
| И ЗарплатаВыплачена.Ссылка = &ДокументСсылка
| И ЗарплатаВыплачена.СпособВыплаты = &ЧерезБанк
|
|СГРУППИРОВАТЬ ПО
| Основной.НомерСтроки,
| Основной.Сотрудник.ФизЛицо,
| Основной.НомерКарточки,
| ВЫБОР КОГДА (ФИОФизЛицСрезПоследних.Фамилия) ЕСТЬ NULL
| ТОГДА Основной.Сотрудник.Физлицо.Наименование
| ИНАЧЕ ФИОФизЛицСрезПоследних.Фамилия + "" "" + ФИОФизЛицСрезПоследних.Имя + "" "" + ФИОФизЛицСрезПоследних.Отчество
| КОНЕЦ,
| ВЫБОР КОГДА Основной.ВыплаченностьЗарплаты = ЗНАЧЕНИЕ(Перечисление.ВыплаченностьЗарплаты.Задепонировано)
| ТОГДА ""Задепонировано""
| ИНАЧЕ """"
| КОНЕЦ,
| Основной.Сотрудник.Код
|
|УПОРЯДОЧИТЬ ПО
| Основной.НомерСтроки
|";
 

unknown181538

НеГуру
28.12.2008
1 417
0
#2
Почему нельзя исползовать одну таблицу? Если сумму нужно получать только когда зп выплачена, используйте конструкцию "ВЫБОР... КОГДА".
 

tanat

Well-Known Member
02.03.2007
265
0
#3
Если я не ошибаюсь, то можно использовать ПРАВОЕ СОЕДИНЕНИЕ
 

puh14

Well-Known Member
11.07.2008
1 412
0
#4
|ИЗ Документ.ЗарплатаКВыплатеОрганизаций.РаботникиОрганизации КАК Основной
|
|ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ФИОФизЛиц.СрезПоследних(&ДатаДокумента, Физлицо В (ВЫБРАТЬ РАЗЛИЧНЫЕ Основной.Сотрудник.Физлицо КАК Физлицо ИЗ Документ.ЗарплатаКВыплатеОрганизаций.РаботникиОрганизации КАК Основной ГДЕ Основной.Ссылка = &ДокументСсылка )) КАК ФИОФизЛицСрезПоследних
|ПО Основной.Сотрудник.Физлицо = ФИОФизЛицСрезПоследних.ФизЛицо
|ЛЕВОЕ СОЕДИНЕНИЕ Документ.ЗарплатаКВыплатеОрганизаций.РаботникиОрганизации КАК ЗарплатаВыплачена
|ПО Основной.Сотрудник.Физлицо= ЗарплатаВыплачена.Сотрудник.Физлицо
|И ЗарплатаВыплачена.ВыплаченностьЗарплаты = &Выплачено

|ГДЕ Основной.Ссылка = &ДокументСсылка

| И Основной.СпособВыплаты = &ЧерезБанк
| И Основной.Банк = &Банк
| И ЗарплатаВыплачена.Ссылка = &ДокументСсылка

Что-то я юмора не понял - ты два раза выбираешь данные из одного и того-же документа. Зачем так?

а режет у тебе скорее всего на ГДЕ ибо левое соединение только null сделать могёт

| И Основной.Банк = &Банк
| И ЗарплатаВыплачена.Ссылка = &ДокументСсылка
| И ЗарплатаВыплачена.СпособВыплаты = &ЧерезБанк

поскольку сильно подозреваю, что в при отсутствии зарплаты банка у тебя нет

тебе тогда проще из регистра сведений левым соединением в документ прыгать с условиями на ссылки, банки и т.д.
 

vitfil

IT-интегратор
02.04.2004
2 062
0
#6
Если я не ошибаюсь, то можно использовать ПРАВОЕ СОЕДИНЕНИЕ
я бы порекомендовал крайне редко его использовать...
исходя хотя бы из того, как будет построен план запроса...
 

tanat

Well-Known Member
02.03.2007
265
0
#7
я бы порекомендовал крайне редко его использовать...
исходя хотя бы из того, как будет построен план запроса...
А есть существенные отличия? Я всегда считал, что ЛЕВОЕ или ПРАВОЕ соединение - это лишь правило, по которому объединяются 2 таблицы. Если левое - то берутся все колонки из таблицы, указанной слева от записи СОЕДИНЕНИЕ, если ПРАВОЕ- то из той, что справа?
Все зависит от порядка указания таблиц...
Или может я не понял сути замечания? :)
 

vitfil

IT-интегратор
02.04.2004
2 062
0
#8
Ну представьте себе, что есть объединение... Поясню на примере.

Допустим имеются 2 таблицы:
Т1
Код:
А  В
1  123
2  227
3  200
4  222
Т2
Код:
А  В
1  123
9  229
3  200
7  224
1  227
Код:
select * from t1 left join t2 on t1.a = t2.a
Получаем следующую таблицу:
Код:
т1.а  т1.В  т2.А  Т2.В
1	  123	1	  123
2	  227
3	  200	3	  200
4	  222
Код:
select * from t1 right join t2 on t1.a = t2.a
Получаем следующую таблицу:
Код:
т1.а  т1.В  т2.А  Т2.В
1	  123	1	  123
9	  229
3	  200	3	  200
7	  224
1	  123	1	  227
И что получается? Делая выборку из Т1, фактически получаем выборку из Т2 с левым соединением с таблицей Т1. Хотя на самом деле требовалась выборка из таблицы Т1.
 

tanat

Well-Known Member
02.03.2007
265
0
#9
И что получается? Делая выборку из Т1, фактически получаем выборку из Т2 с левым соединением с таблицей Т1. Хотя на самом деле требовалась выборка из таблицы Т1.
Я это и имел ввиду, говоря о порядке таблиц). Особой разницы я все равно не вижу. Если задача позволяет пользоваться ПРАВЫМ и вы понимаете, какой результат в итоге получите - почему бы не воспользоватсья?