Имя: Пароль:
1C
1С v8
Помогите. не работает объединение запросов
0 Cerera
 
04.06.12
14:21
Пытаюсь объединить два запроса в которых есть совпадающие поля. но он не объединяет их. хотя должен. вот запрос.

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ разрешенные
   Расход.Номенклатура,
   Расход.ХарактеристикаНоменклатуры,
   Расход.ХарактеристикаНоменклатуры.XYZкласс КАК XYZкласс,
   Расход.ХарактеристикаНоменклатуры.ABCкласс КАК ABCкласс,
   СУММА(Расход.КоличествоРасход) КАК Расход,
   0 КАК КоличествоОстаток,
   СДООбщаяДляНоменклатуры.СДО,
   ЕСТЬNULL(ТаблицаНадежностиПоставщиков.ЦП, 0) КАК ЦП,
   ЕСТЬNULL(ТаблицаНадежностиПоставщиков.ВП, 0) КАК ВП,
   Расход.ХарактеристикаНоменклатуры.ОсновнойПоставщик КАК ОсновнойПоставщик,
   (ЕСТЬNULL(ТаблицаНадежностиПоставщиков.ЦП, 0) - 5.5) * СДООбщаяДляНоменклатуры.СДО КАК СЗ,
   СДООбщаяДляНоменклатуры.СДО * (ЕСТЬNULL(ТаблицаНадежностиПоставщиков.ВП, 0) + ЕСТЬNULL(ТаблицаНадежностиПоставщиков.ЦП, 0)) + (ЕСТЬNULL(ТаблицаНадежностиПоставщиков.ЦП, 0) - 5.5) * СДООбщаяДляНоменклатуры.СДО КАК МинОст,
   Расход.Склад
ИЗ
   Расход КАК Расход
       ЛЕВОЕ СОЕДИНЕНИЕ СДООбщаяДляНоменклатуры КАК СДООбщаяДляНоменклатуры
       ПО Расход.Номенклатура = СДООбщаяДляНоменклатуры.Номенклатура
           И Расход.ХарактеристикаНоменклатуры = СДООбщаяДляНоменклатуры.ХарактеристикаНоменклатуры
       ЛЕВОЕ СОЕДИНЕНИЕ ТаблицаНадежностиПоставщиков КАК ТаблицаНадежностиПоставщиков
       ПО Расход.ХарактеристикаНоменклатуры.ОсновнойПоставщик = ТаблицаНадежностиПоставщиков.Контрагент
ГДЕ
   Расход.Склад = &Склад

СГРУППИРОВАТЬ ПО
   Расход.Номенклатура,
   Расход.ХарактеристикаНоменклатуры,
   СДООбщаяДляНоменклатуры.СДО,
   Расход.ХарактеристикаНоменклатуры.ОсновнойПоставщик,
   ЕСТЬNULL(ТаблицаНадежностиПоставщиков.ЦП, 0),
   ЕСТЬNULL(ТаблицаНадежностиПоставщиков.ВП, 0),
   Расход.Склад,
   Расход.ХарактеристикаНоменклатуры.XYZкласс,
   Расход.ХарактеристикаНоменклатуры.ABCкласс,
   (ЕСТЬNULL(ТаблицаНадежностиПоставщиков.ЦП, 0) - 5.5) * СДООбщаяДляНоменклатуры.СДО,
   СДООбщаяДляНоменклатуры.СДО * (ЕСТЬNULL(ТаблицаНадежностиПоставщиков.ВП, 0) + ЕСТЬNULL(ТаблицаНадежностиПоставщиков.ЦП, 0)) + (ЕСТЬNULL(ТаблицаНадежностиПоставщиков.ЦП, 0) - 5.5) * СДООбщаяДляНоменклатуры.СДО

ОБЪЕДИНИТЬ все

ВЫБРАТЬ
   ТоварыНаСкладахОстатки.Номенклатура,
   ТоварыНаСкладахОстатки.ХарактеристикаНоменклатуры,
   ТоварыНаСкладахОстатки.ХарактеристикаНоменклатуры.XYZкласс,
   ТоварыНаСкладахОстатки.ХарактеристикаНоменклатуры.ABCкласс,
   0,
   СУММА(ТоварыНаСкладахОстатки.КоличествоОстаток),
   0,
   0,
   0,
   ТоварыНаСкладахОстатки.ХарактеристикаНоменклатуры.ОсновнойПоставщик,
   0,
   0,
   ТоварыНаСкладахОстатки.Склад
ИЗ
   РегистрНакопления.ТоварыНаСкладах.Остатки(&ДатаАнализа, ) КАК ТоварыНаСкладахОстатки
ГДЕ
   ТоварыНаСкладахОстатки.Склад = &Склад

СГРУППИРОВАТЬ ПО
   ТоварыНаСкладахОстатки.Номенклатура,
   ТоварыНаСкладахОстатки.ХарактеристикаНоменклатуры,
   ТоварыНаСкладахОстатки.Склад,
   ТоварыНаСкладахОстатки.ХарактеристикаНоменклатуры.XYZкласс,
   ТоварыНаСкладахОстатки.ХарактеристикаНоменклатуры.ABCкласс,
   ТоварыНаСкладахОстатки.ХарактеристикаНоменклатуры.ОсновнойПоставщик

Но почему то поля с одинаковыми ключами все равно отдельными строками идут. даже если ОБЪЕДИНИТЬ все на объединить заменить.
1 PR
 
04.06.12
14:22
Все правильно.
2 acsent
 
04.06.12
14:22
что значит не объеденяет?
3 DrShad
 
04.06.12
14:23
у тя во втором на два поля меньше
4 DrShad
 
04.06.12
14:23
+(3) ТС нужно личку поменять никуя он не программист 1С
5 Maxus43
 
04.06.12
14:24
ты группируеш каждый отельный запрос, а надо сгруппировать 1 раз оба запроса
6 Cerera
 
04.06.12
14:25
(3)как? в первом 13 и во втором 13
(4)программист это тот кто пишет программы.
(5)убрать группировку?
7 Maxus43
 
04.06.12
14:26
(6) убрать 2 группировки, обернуть всё во вложенный запрос и его уже 1 раз сгруппировать
8 Cerera
 
04.06.12
14:40
(7)а без вложенного значит нельзя?
9 Maxus43
 
04.06.12
14:42
ну можеш в ВТ запихнуть. ОБЪЕДИНИТЬ - добавляет строки снизу. ты сгруппировал один запрос, а потом СНИЗУ добавляеш другой сгруппированый... это ж видно вроде
10 sapphire
 
04.06.12
14:45
(9) Зачем?
11 sapphire
 
04.06.12
14:46
(8) А чем пугает вложенный запрос?
12 Maxus43
 
04.06.12
14:46
(10) >>Но почему то поля с одинаковыми ключами все равно отдельными строками идут
я это так расшифровал. он хочет объединённые запросы сгруппировать
13 sapphire
 
04.06.12
14:48
(12) Я про временные таблицы. Про сгруппировать и так из запроса ясно.
14 Maxus43
 
04.06.12
14:51
(13) от задачи зависит... если надо проиндексировать для дальнейшего использования - в ВТ лучше сгруппировать сразу
15 sapphire
 
04.06.12
14:51
(12) Судя по всему - ему надо проверить что можно отгрузить  поскольку фигурирует временная таблица "Расход".
16 sapphire
 
04.06.12
14:51
(14) Применение индексов не всегда оправдано.
17 Maxus43
 
04.06.12
14:52
в каждом случае конечно надо думать
18 sapphire
 
04.06.12
14:53
(17) на sqlcmd.ru есть полезное инфо об индексировании и прочей лабуде :)
19 Cerera
 
04.06.12
14:55
(11)не пугает. я просто хочу досконально понять что не так и как это работает. я хочу стать экспертом запросов как   Maxus43 чтоб всякие (4)обходили меня стороной боясь облажаться
20 Maxus43
 
04.06.12
14:57
(19) я тупой и ленивый(
21 sapphire
 
04.06.12
14:59
(0) ТС, какие поля ДБ на выходе, все 13? Тогда
SELECT
    Номенклатура
   ,ХарактеристикаНоменклатуры
   ,MAX(XYZкласс) XYZкласс
   ,MAX(ABCкласс) ABCкласс
   ,SUM(Расход) Расход
   ,SUM(КоличествоОстаток) КоличествоОстаток
   ,MAX(СДО) СДО
   ,MAX(ЦП) ЦП
   ,MAX(ОсновнойПоставщик) ОсновнойПоставщик
   ,MAX(СЗ) СЗ
   ,MAX(МинОст) МинОст
   ,Склад
FROM
(
ВЫБРАТЬ разрешенные
   Расход.Номенклатура,
   Расход.ХарактеристикаНоменклатуры,
   Расход.ХарактеристикаНоменклатуры.XYZкласс КАК XYZкласс,
   Расход.ХарактеристикаНоменклатуры.ABCкласс КАК ABCкласс,
   СУММА(Расход.КоличествоРасход) КАК Расход,
   0 КАК КоличествоОстаток,
   СДООбщаяДляНоменклатуры.СДО,
   ЕСТЬNULL(ТаблицаНадежностиПоставщиков.ЦП, 0) КАК ЦП,
   ЕСТЬNULL(ТаблицаНадежностиПоставщиков.ВП, 0) КАК ВП,
   Расход.ХарактеристикаНоменклатуры.ОсновнойПоставщик КАК ОсновнойПоставщик,
   (ЕСТЬNULL(ТаблицаНадежностиПоставщиков.ЦП, 0) - 5.5) * СДООбщаяДляНоменклатуры.СДО КАК СЗ,
   СДООбщаяДляНоменклатуры.СДО * (ЕСТЬNULL(ТаблицаНадежностиПоставщиков.ВП, 0) + ЕСТЬNULL(ТаблицаНадежностиПоставщиков.ЦП, 0)) + (ЕСТЬNULL(ТаблицаНадежностиПоставщиков.ЦП, 0) - 5.5) * СДООбщаяДляНоменклатуры.СДО КАК МинОст,
   Расход.Склад
ИЗ
   Расход КАК Расход
       ЛЕВОЕ СОЕДИНЕНИЕ СДООбщаяДляНоменклатуры КАК СДООбщаяДляНоменклатуры
       ПО Расход.Номенклатура = СДООбщаяДляНоменклатуры.Номенклатура
           И Расход.ХарактеристикаНоменклатуры = СДООбщаяДляНоменклатуры.ХарактеристикаНоменклатуры
       ЛЕВОЕ СОЕДИНЕНИЕ ТаблицаНадежностиПоставщиков КАК ТаблицаНадежностиПоставщиков
       ПО Расход.ХарактеристикаНоменклатуры.ОсновнойПоставщик = ТаблицаНадежностиПоставщиков.Контрагент
ГДЕ
   Расход.Склад = &Склад

СГРУППИРОВАТЬ ПО
   Расход.Номенклатура,
   Расход.ХарактеристикаНоменклатуры,
   СДООбщаяДляНоменклатуры.СДО,
   Расход.ХарактеристикаНоменклатуры.ОсновнойПоставщик,
   ЕСТЬNULL(ТаблицаНадежностиПоставщиков.ЦП, 0),
   ЕСТЬNULL(ТаблицаНадежностиПоставщиков.ВП, 0),
   Расход.Склад,
   Расход.ХарактеристикаНоменклатуры.XYZкласс,
   Расход.ХарактеристикаНоменклатуры.ABCкласс,
   (ЕСТЬNULL(ТаблицаНадежностиПоставщиков.ЦП, 0) - 5.5) * СДООбщаяДляНоменклатуры.СДО,
   СДООбщаяДляНоменклатуры.СДО * (ЕСТЬNULL(ТаблицаНадежностиПоставщиков.ВП, 0) + ЕСТЬNULL(ТаблицаНадежностиПоставщиков.ЦП, 0)) + (ЕСТЬNULL(ТаблицаНадежностиПоставщиков.ЦП, 0) - 5.5) * СДООбщаяДляНоменклатуры.СДО

ОБЪЕДИНИТЬ все

ВЫБРАТЬ
   ТоварыНаСкладахОстатки.Номенклатура,
   ТоварыНаСкладахОстатки.ХарактеристикаНоменклатуры,
   ТоварыНаСкладахОстатки.ХарактеристикаНоменклатуры.XYZкласс,
   ТоварыНаСкладахОстатки.ХарактеристикаНоменклатуры.ABCкласс,
   0,
   СУММА(ТоварыНаСкладахОстатки.КоличествоОстаток),
   0,
   0,
   0,
   ТоварыНаСкладахОстатки.ХарактеристикаНоменклатуры.ОсновнойПоставщик,
   0,
   0,
   ТоварыНаСкладахОстатки.Склад
ИЗ
   РегистрНакопления.ТоварыНаСкладах.Остатки(&ДатаАнализа, ) КАК ТоварыНаСкладахОстатки
ГДЕ
   ТоварыНаСкладахОстатки.Склад = &Склад

СГРУППИРОВАТЬ ПО
   ТоварыНаСкладахОстатки.Номенклатура,
   ТоварыНаСкладахОстатки.ХарактеристикаНоменклатуры,
   ТоварыНаСкладахОстатки.Склад,
   ТоварыНаСкладахОстатки.ХарактеристикаНоменклатуры.XYZкласс,
   ТоварыНаСкладахОстатки.ХарактеристикаНоменклатуры.ABCкласс,
   ТоварыНаСкладахОстатки.ХарактеристикаНоменклатуры.ОсновнойПоставщик
) Запрос
GROUP BY

    Номенклатура
   ,ХарактеристикаНоменклатуры
   ,Склад
22 Cerera
 
04.06.12
15:00
(12)(15)мне нужно чтоб Расход и Остаток шли рядом. а  у меня получается что
Товар1 Характеристика1 Расход 0
Товар1 Характеристика1 0       Остаток

вместо того чтоб рядом идти. в одной строке
23 Cerera
 
04.06.12
15:01
(21)сейчас разберусь спасибо! а как вы это сделали? в какой среде разработки? или ручками?
24 sapphire
 
04.06.12
15:02
(19) Ок. Смотри, создадим 2 таблицы
SELECT
*
INTO A
FROM
(
SELECT 1 a, 2 Б
UNION ALL
SELECT 1 a, 2 Б
) A;

SELECT
*
INTO B
FROM
(
SELECT 1 a, 2 Б
UNION
SELECT 1 a, 2 Б
) B;

SELECT * FROM A; // вернет 2 записи
SELECT * FROM B; // вернет 1 запись
25 sapphire
 
04.06.12
15:03
(23) Руками
26 Maxus43
 
04.06.12
15:03
(24) мне лень раскладку переключать, тока по руски пишу давно...)
27 sapphire
 
04.06.12
15:06
(24) Точнее вот так, из-за того, что 1С не любит, когда таблицы имеют одинаковые имена с полями:
SELECT
*
INTO Aa
FROM
(
SELECT 1 a, 2 Б
UNION ALL
SELECT 1 a, 2 Б
) Aа;

SELECT
*
INTO Bb
FROM
(
SELECT 1 a, 2 Б
UNION
SELECT 1 a, 2 Б
) B;

SELECT * FROM Aa; // вернет 2 записи

SELECT * FROM Bb; // вернет 1 запись
28 sapphire
 
04.06.12
15:07
(26) Я НИКОГДА не пишу запросы по-русски.
29 Cerera
 
04.06.12
15:08
понял! остается сейчас вникнуть!
благодарю вас!
30 Maxus43
 
04.06.12
15:09
SELECT * FROM Bb, Аа; //крос джойн, вернёт все сочетания таблиц

(28) печально такое отлаживать если чесно. у нас прог один даже код по англицки писал... на него все матом ругались, а потом он уволился со словами 1с гамно)
31 sapphire
 
04.06.12
15:12
(30) Неубедительно. Конструкции языка я пишу по-русски, да и ребятам ничего не стОит открыть запрос конструктором.
32 Maxus43
 
04.06.12
15:14
(31) а это не должно быть убедительно... это религиозное
33 acsent
 
04.06.12
15:26
(31) ты принципиально запрос конструктором не открываешь?
34 hhhh
 
04.06.12
15:32
(28) ну вот же, SELECT 1 a, 2 Б - буква "Б". Запрос по-русски. В топку.
35 Cerera
 
06.06.12
10:28
Кто может подсказать в какой книге можно прочитать про вложенные запросы? видеокурс есть но не могу на работе просмотреть.