|
Вопрос по полному соединению двух виртуальных таблиц | ☑ | ||
---|---|---|---|---|
0
Капюшон
30.10.12
✎
10:39
|
Есть две виртуальные таблицы остатков. Мне нужно соединить их с детализацией по регистратору. А потом выводить с группировкой по регистратору.
Вот я делаю полное соединение и в параметрах связи указываю регистратор. и из обеих таблиц выбираю поле "Регистратор" и получается два поля "Регистратор" и "Регистратор1". а как мне превратить их в одно поле, по которому будет делаться группировка? Я делал при помощи вложенного запроса, но в этом случае некорректно считались итоги. |
|||
1
Плот
30.10.12
✎
10:40
|
(0) Давай код
|
|||
2
чувак
30.10.12
✎
10:41
|
защем?
|
|||
3
GLazNik
30.10.12
✎
10:41
|
(0) а может лучше объединением?
а так ЕСТЬNULL(Регистратор,Регистратор1) |
|||
4
Рэйв
30.10.12
✎
10:41
|
Тогда объединяй, а не соединяй.
А потом сворачивай. |
|||
5
Капюшон
30.10.12
✎
10:44
|
(1)
ВЫБРАТЬ ПотребностьЗаказаПоставщикуОстаткиИОбороты.Регистратор КАК Регистратор, ПотребностьЗаказаПоставщикуОстаткиИОбороты.ПериодСекунда КАК ПериодСекунда, ПотребностьЗаказаПоставщикуОстаткиИОбороты.Склад КАК Склад, ПотребностьЗаказаПоставщикуОстаткиИОбороты.Номенклатура КАК Номенклатура, ПотребностьЗаказаПоставщикуОстаткиИОбороты.ПотребностьНачальныйОстаток КАК ПотребностьНачальныйОстаток, ПотребностьЗаказаПоставщикуОстаткиИОбороты.ПотребностьПриход КАК ПотребностьПриход, ПотребностьЗаказаПоставщикуОстаткиИОбороты.ПотребностьРасход КАК ПотребностьРасход, ПотребностьЗаказаПоставщикуОстаткиИОбороты.ПотребностьКонечныйОстаток КАК ПотребностьКонечныйОстаток ПОМЕСТИТЬ ЗапазыПоставщику {ВЫБРАТЬ Регистратор.*, ПериодСекунда, Склад.*, Номенклатура.*, ПотребностьНачальныйОстаток, ПотребностьПриход, ПотребностьРасход, ПотребностьКонечныйОстаток} ИЗ РегистрНакопления.ПотребностьЗаказаПоставщику.ОстаткиИОбороты({(&ВыбНачПериода)}, {(&ВыбКонПериода)}, Авто, , ) КАК ПотребностьЗаказаПоставщикуОстаткиИОбороты {ГДЕ ПотребностьЗаказаПоставщикуОстаткиИОбороты.Склад.*, ПотребностьЗаказаПоставщикуОстаткиИОбороты.Номенклатура.*, ПотребностьЗаказаПоставщикуОстаткиИОбороты.ХарактеристикаНоменклатуры.*, ПотребностьЗаказаПоставщикуОстаткиИОбороты.Контрагент.*} ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ПотребностьЗаказаПокупателяОстаткиИОбороты.Регистратор КАК Регистратор, ПотребностьЗаказаПокупателяОстаткиИОбороты.ПериодСекунда КАК ПериодСекунда, ПотребностьЗаказаПокупателяОстаткиИОбороты.Склад КАК Склад, ПотребностьЗаказаПокупателяОстаткиИОбороты.Номенклатура КАК Номенклатура, ПотребностьЗаказаПокупателяОстаткиИОбороты.ПотребностьНачальныйОстаток КАК ПотребностьНачальныйОстаток, ПотребностьЗаказаПокупателяОстаткиИОбороты.ПотребностьПриход КАК ПотребностьПриход, ПотребностьЗаказаПокупателяОстаткиИОбороты.ПотребностьРасход КАК ПотребностьРасход, ПотребностьЗаказаПокупателяОстаткиИОбороты.ПотребностьКонечныйОстаток КАК ПотребностьКонечныйОстаток ПОМЕСТИТЬ ЗаказыПокупателя {ВЫБРАТЬ Регистратор.*, ПериодСекунда, Склад.*, Номенклатура.*, ПотребностьНачальныйОстаток, ПотребностьПриход, ПотребностьРасход, ПотребностьКонечныйОстаток} ИЗ РегистрНакопления.ПотребностьЗаказаПокупателя.ОстаткиИОбороты({(&ВыбНачПериода)}, {(&ВыбКонПериода)}, Авто, , ) КАК ПотребностьЗаказаПокупателяОстаткиИОбороты {ГДЕ ПотребностьЗаказаПокупателяОстаткиИОбороты.Склад.*, ПотребностьЗаказаПокупателяОстаткиИОбороты.Номенклатура.*, ПотребностьЗаказаПокупателяОстаткиИОбороты.ХарактеристикаНоменклатуры.*, ПотребностьЗаказаПокупателяОстаткиИОбороты.Контрагент.*} ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ЗаказыПокупателя.Склад КАК Склад, ЗаказыПокупателя.Номенклатура КАК Номенклатура, ЗаказыПокупателя.Регистратор КАК Регистратор, ЗаказыПокупателя.ПотребностьНачальныйОстаток КАК ПотребностьНачальныйОстаток, ЗаказыПокупателя.ПотребностьПриход КАК ПотребностьПриход, ЗаказыПокупателя.ПотребностьРасход КАК ПотребностьРасход, ЗаказыПокупателя.ПотребностьКонечныйОстаток КАК ПотребностьКонечныйОстаток, ЗапазыПоставщику.ПотребностьНачальныйОстаток КАК ПотребностьНачальныйОстаток1, ЗапазыПоставщику.ПотребностьПриход КАК ПотребностьПриход1, ЗапазыПоставщику.ПотребностьРасход КАК ПотребностьРасход1, ЗапазыПоставщику.ПотребностьКонечныйОстаток КАК ПотребностьКонечныйОстаток1, ЗаказыПокупателя.ПериодСекунда КАК ПериодСекунда, ЗапазыПоставщику.Регистратор КАК Регистратор1 {ВЫБРАТЬ Склад.*, Номенклатура.*, Регистратор.*, ПотребностьНачальныйОстаток, ПотребностьПриход, ПотребностьРасход, ПотребностьКонечныйОстаток, ПотребностьНачальныйОстаток1, ПотребностьПриход1, ПотребностьРасход1, ПотребностьКонечныйОстаток1, ПериодСекунда} ИЗ ЗапазыПоставщику КАК ЗапазыПоставщику ПОЛНОЕ СОЕДИНЕНИЕ ЗаказыПокупателя КАК ЗаказыПокупателя ПО ЗапазыПоставщику.Склад = ЗаказыПокупателя.Склад И ЗапазыПоставщику.Номенклатура = ЗаказыПокупателя.Номенклатура И ЗапазыПоставщику.Регистратор = ЗаказыПокупателя.Регистратор {ГДЕ ЗаказыПокупателя.Склад.*, ЗаказыПокупателя.Номенклатура.*} |
|||
6
Капюшон
30.10.12
✎
10:44
|
(4)объединять = вложенный запрос ?
|
|||
7
Капюшон
30.10.12
✎
10:46
|
как корректно вставлять код в топики? какой тег использовать?
|
|||
8
GLazNik
30.10.12
✎
10:47
|
(1) вот нафига ты это спросил... вот теперь сиди и разбирай сие творение :)
(6) объединять <> вложенный запрос |
|||
9
Капюшон
30.10.12
✎
10:48
|
(8)ну во вложенном запросе же сначала запросы объединяются командой "Объединить всё", а затем выборка группируется. правильно?
|
|||
10
GLazNik
30.10.12
✎
10:49
|
(9) зависит от потребностей. в общем случае группировать не обязательно.
|
|||
11
Плот
30.10.12
✎
10:50
|
(5) Т.е. ты делаешь соединение по регистратору складу?
|
|||
12
Капюшон
30.10.12
✎
10:51
|
(11)да. полное соединение. но мне нужно не совсем это. мне нужна группировка по регистратора.
|
|||
13
Рэйв
30.10.12
✎
10:53
|
(6)Объединить - это два запроса под одну таблицу- один вслед за другим в тех же колонках
|
|||
14
GLazNik
30.10.12
✎
10:53
|
(12) запрос не смотрел, ибо лень. А остальные поля разные или так же могут браться из двух таблиц?
|
|||
15
Капюшон
30.10.12
✎
10:55
|
(14)остатки то у них разные и обороты. поэтому их в разные поля.
|
|||
16
Капюшон
30.10.12
✎
10:56
|
(13)да. но когда хочешь чтоб в отдельные столбики поля легли, ставишь Null. просто когда в СКД химичишь, "создать вложенный запрос" нажимаю сначала.
|
|||
17
acsent
30.10.12
✎
10:57
|
ЕСТЬNULL(Рег.Регистратор, Рег1.Регистратор)
|
|||
18
Shurjk
30.10.12
✎
10:58
|
Если по регистратору соединяешь, то это уже не полное соединение, а левое или правое или внутреннее.
|
|||
19
Капюшон
30.10.12
✎
11:00
|
(18)почему так?
|
|||
20
Shurjk
30.10.12
✎
11:00
|
(19) По определению.
|
|||
21
Shurjk
30.10.12
✎
11:01
|
+(20) Параметры соединяния это по сути условие которое накладывается на полное соединение после чего это соединение нельзя считать полным.
|
|||
22
Плот
30.10.12
✎
11:02
|
(16) Сдается мне, что тебе нужно не полное соединение.
|
|||
23
Капюшон
30.10.12
✎
11:04
|
(22)мне нужно две виртуальные таблицы выводить в отчет но так, чтобы у них группировка была и по регистратору но с правильными итогами.
|
|||
24
Плот
30.10.12
✎
11:06
|
(23) Тогда тебе нужно делать объединение.
|
|||
25
GLazNik
30.10.12
✎
11:06
|
(18) какая разница? хоть по регистратору, хоть не по регистратору...
(21) это не условия, это критерия соединения двух таблиц (17) нас игнорируют:) |
|||
26
Shurjk
30.10.12
✎
11:07
|
(23) В твоем случае регистратор будет всегда равный так как ты по нему их соеденил, а вот насчет правильных итогов здесь уже совсем другой вопрос, думаю что правильно сказали что тебе нужно не соединение, а объединение, ведь соединение это по сути умножение таблиц, а объединение это сложение.
|
|||
27
Капюшон
30.10.12
✎
11:08
|
(17)это мысль. спасибо!
|
|||
28
Shurjk
30.10.12
✎
11:08
|
(25) Разницы нет, все равно будет оно уже не полным. А как правильно назвать критерием или условием тут сути не поменяет.
|
|||
29
Капюшон
30.10.12
✎
11:10
|
(26)вот и я понимаю, что объеднение нужно. только делал объединением и итоги считались неверно ( точнее конечный остаток неверно считался в одном случае и никто не смог помочь.
v8: Я в тупике. СКД криво считает конечный остаток. Я всё изучил но не могу понять. |
|||
30
Shurjk
30.10.12
✎
11:12
|
(29) Ну в том случае помочь это просто взять и написать за тебя запрос. А тут по моему ты просто не понимаешь как работают запросы.
|
|||
31
Капюшон
30.10.12
✎
11:13
|
(30)а в том то и дело что опыт кое-какой написания запросов имею. мне нужна только подсказка. там же конкретный четкий вопрос почему не работает соединение
|
|||
32
Капюшон
30.10.12
✎
11:14
|
(30)точнее вроде всё просто. объединяю запросы. в результирующую таблицу вывожу результат. СКД не правильно считает итоги, хотя я роли указал верно и итс изучил и вообще перерыл уже кучу всего
|
|||
33
GLazNik
30.10.12
✎
11:14
|
(28) а каким оно будет? :)
(26) что соединение, что объединение, результат будет в принципе один... но по оптимальности чет думается что объединение таки быстрее... |
|||
34
Shurjk
30.10.12
✎
11:15
|
(31) Не верю что оно не работает, консоль запросов тебе в помощь.
|
|||
35
Shurjk
30.10.12
✎
11:16
|
(33) Ты хочешь сказать что объединение и соединение дает один результат?
|
|||
36
Капюшон
30.10.12
✎
11:16
|
(34)а в консоли работает. а вот в СКД нет. скд врёт с итогами
|
|||
37
Плот
30.10.12
✎
11:16
|
(32) Может тебе все таки нужно внутреннее соедниенеи?
|
|||
38
Shurjk
30.10.12
✎
11:18
|
(36) Попробуй посчитать итоги в консоле.
|
|||
39
Капюшон
30.10.12
✎
11:18
|
(32)если будет внутреннее соединение, то мы не увидим все данные. ведь два регистра разные. они имеют разные регистраторы.
|
|||
40
Плот
30.10.12
✎
11:18
|
(0) Тебе нужно из двух таблиц получить одну результрующую что бы итоги были сгруппированы по регистраторам?
|
|||
41
Shurjk
30.10.12
✎
11:19
|
(39) Делай объединение так хоть количество строк будет правильным.
|
|||
42
Капюшон
30.10.12
✎
11:19
|
(36)попробую сейчас.
(40)именно. только итоги двух таблиц чтоб отдельными полями шли. но помимо регистраторов чтоб и другие были группировки |
|||
43
Капюшон
30.10.12
✎
11:20
|
(41)сейчас протестирую с объединением.
|
|||
44
GLazNik
30.10.12
✎
11:22
|
(35) в определенных условиях - да...
т.е. если мы имеем две таблицы Поле1,Количество1,Сумма1 и Поле2,Количество2,Сумма2 и хотим получить одну таблицу вида (Поле1 или Поле2),Количество1,Сумма1,Количество2,Сумма2 То следующие два запроса дадут индетичный результат: Выбрать ЕСТЬNULL(Таб1.Поле1,Таб2.Поле2) ,Таб1.Количество1 ,Таб1.Сумма1 ,Таб2.Количество2 ,Таб2.Сумма2 ИЗ Таб1 ПОЛНОЕ СОЕДИНЕНИЕ Таб2 По Таб1.Поле1 = Таб2.Поле2 И ВЫБРАТЬ Поле,Сумма(Количество1),Сумма(Сумма1),Сумма(Количество2),Сумма(Сумма2) ИЗ ( ВЫБРАТь Таб1.Поле1 КАК Поле ,Таб1.Количество1 КАК Количество1 ,Таб1.Сумма1 КАК Сумма1 ,0 КАК Колчиество2 ,0 КАК Сумма2 ИЗ Таб1 ОБЪЕДЕНИТЬ ВСЕ ВЫБРАТЬ Таб2.Поле2 ,0 ,0 ,Таб2.Количество2 ,Таб2.Сумма2 ) СГРУППИРОВАТЬ ПО Поле |
|||
45
GLazNik
30.10.12
✎
11:23
|
+(44) небольшая ошибка
в конце так должно быть: ВЫБРАТЬ Таб2.Поле2 ,0 ,0 ,Таб2.Количество2 ,Таб2.Сумма2 ИЗ Таб2 ) СГРУППИРОВАТЬ ПО Поле Собственно это можно использовать для решения (0) |
|||
46
Капюшон
30.10.12
✎
11:26
|
(44)вот эту строчку не понял
Таб1 ПОЛНОЕ СОЕДИНЕНИЕ Таб2 По Таб1.Поле1 = Таб2.Поле2 а если таб1.Поле1<>Таб2.Поле2 ? |
|||
47
Shurjk
30.10.12
✎
11:27
|
(44) Сомневаюсь что конструкция Таб1 ПОЛНОЕ СОЕДИНЕНИЕ Таб2 По Таб1.Поле1 = Таб2.Поле2 вообще будет работать ибо как уже заметил если есть условие соединение неполное.
Ответь пожалуйста на один вопрос есть две таблицы в одной 3 строки в другой 4, сколько строк будет в результате полного соединения этих таблиц и в результате их объединения. |
|||
48
Shurjk
30.10.12
✎
11:29
|
+(47) А не будет работать эта конструкция но смысла в ней никакого нет.
|
|||
49
Fragster
гуру
30.10.12
✎
11:30
|
я представляю, какая гадость у автора получится...
|
|||
50
Shurjk
30.10.12
✎
11:32
|
(49) Может все таки разберется и поймет в конце концов как запросы работают.
|
|||
51
Fragster
гуру
30.10.12
✎
11:33
|
(50) прям вот сегодня возьмет и разберется?
|
|||
52
Капюшон
30.10.12
✎
11:33
|
(50)ну вот если взять объединение обычное самое то должно работать там тяжело не понимать
|
|||
53
Fragster
гуру
30.10.12
✎
11:34
|
я просто ветку не читал... если дошли до объединения - прогресс
|
|||
54
GLazNik
30.10.12
✎
11:34
|
(46) а если таб1.Поле1<>Таб2.Поле2 то в результирующей таблице будет запись только первой или второй таблицы.
(47) я не знаю с чего вы взяли, что соединение не полное. Количество строк будет от 4 до 7. (51) именно сегодня возьмет и начнет разбираться :) не всеж рождались гениями запросов. |
|||
55
Капюшон
30.10.12
✎
11:34
|
(51)я кстати видел уже ветки с другого форума там где вы тоже в них отписывались. с аналогичными проблемами. это всё CRL/
|
|||
56
Shurjk
30.10.12
✎
11:35
|
(51) По крайней мере уже начал.
|
|||
57
Капюшон
30.10.12
✎
11:35
|
(53)я умею делать объединения. вот в ветке вчерашней там изначально запрос на объединении был. но итог считался неверно.
v8: Я в тупике. СКД криво считает конечный остаток. Я всё изучил но не могу понять. |
|||
58
Капюшон
30.10.12
✎
11:37
|
вот ещё ветка v8: СКД и расчет итогов
|
|||
59
Shurjk
30.10.12
✎
11:37
|
(54) Отличный ответ - при чем неправильный. В первом случае число не попадает даже в этот диапазон. Кстати приведенное в примере условие не коим образом не повлияет на результат полного соединения.
|
|||
60
GLazNik
30.10.12
✎
11:37
|
(53) на мисте это редкость? :)
|
|||
61
GLazNik
30.10.12
✎
11:40
|
(59) это как не повлияет... вы о чем вообще?
|
|||
62
GLazNik
30.10.12
✎
11:41
|
+(61) к (59) ну и уж раз такое дело, то какой ответ правильный?
|
|||
63
Shurjk
30.10.12
✎
11:41
|
(61) Учите определения до полного просветление если вы ставите слово полное то строки обеих таблиц будут попадать в результат независимо от того выполнилось условие или нет.
|
|||
64
Shurjk
30.10.12
✎
11:42
|
(62) 12 и 7 почему так подумай сам.
|
|||
65
Капюшон
30.10.12
✎
11:45
|
(63)это известно. по этой причине и нужно вложенный запрос делать, где снаружи будут выборки из результирующей таблицы, а внутри будет объединение запросов.
|
|||
66
GLazNik
30.10.12
✎
11:45
|
(63) это вы то мне предлагаете учит?
так... для общего развития: wiki:Join_(SQL)#FULL_OUTER_JOIN |
|||
67
Fragster
гуру
30.10.12
✎
11:45
|
(57) хз, у меня всё считает правильно
|
|||
68
GLazNik
30.10.12
✎
11:47
|
(64) более 7 записей будет только в том случае если Поле1 и Поле2 не уникальны в своих таблицах
|
|||
69
Shurjk
30.10.12
✎
11:48
|
(68) Что такое полное соединение.
(66) Чем спорить лучше попробуй. |
|||
70
Shurjk
30.10.12
✎
11:50
|
+(69) имеется ввиду полное соединение в 1с, какому из соединений в SQL оно соответствует?
|
|||
71
GLazNik
30.10.12
✎
11:53
|
(70) как и положенно по названию FULL JOIN (а не CROSS... как вам кажется)
Описание из справки 1С (на случай, если у вас ее украли): ПОЛНОЕ [ВНЕШНЕЕ] СОЕДИНЕНИЕ означает, что в результат запроса надо включить комбинации записей из обеих исходных таблиц, которые соответствуют указанному условию. Кроме того, в результат запроса надо включить также еще и те записи из обоих источников, для которых не найдено соответствий. Таким образом, в результат запроса будут включены все записи из обоих источников; они будут соединены друг с другом при выполнении указанного условия. Строки результата запроса, для которых не найдено соответствующих условию записей из какого-либо источника, будут содержать NULL в полях, формируемых на основании записей из этого источника. Ключевое слова ВНЕШНЕЕ можно не указывать вообще, оно повышает наглядность и удобочитаемость текста запроса. |
|||
72
Feanorko
30.10.12
✎
11:58
|
Всё не читал, если по регистратору соединяешь - у тебя там Null может быть, это нужно описывать в условиях соединения отдельно
|
|||
73
Капюшон
30.10.12
✎
13:23
|
Я решил задачу очень просто: Создал объединением запрос и поместил его набор данных. а потом соединил с ним два других набора (каждого регистра) по отдельности. и брал их итоговые поля. вот это дело заработало великолепно.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |