Имя: Пароль:
1C
1C 7.7
v7: Не получается прикрутить LEFT JOIN в прямом запросе
,
0 Zhuravlik
 
08.10.12
14:59
Здравствуйте. Хочу к запросу по итогам добавить колонки с характеристиками. После того, как добавляю LEFT JOIN ругается, что "no such column: Остатки.Поставщик". Вот код:

   ТекстЗапрос_АЛЛ = "
   |SELECT
   |    Остатки.Поставщик [Поставщик $Справочник.Контрагенты],
   |    Остатки.Договор [Договор $Справочник.Договор],
   |    Остатки.Вагон [Вагон],
   |    Остатки.Автомобиль [Автомобиль $Справочник.Автомобили],
   |    SUM (Остатки.Количество) [Количество $Число]
   |FROM
   |    (
   | -- Итоги на конец предыдущего периода
   |    SELECT
   |        Итоги.Поставщик Поставщик,
   |        Итоги.Договор Договор,
   |        Итоги.Вагон Вагон,
   |        Итоги.Автомобиль Автомобиль,
   |        Итоги.Количество Количество
   |    FROM
   |        [РегистрИтоги.Авто_ВДороге] Итоги
   |    WHERE
   |        Итоги.period = :ДатаИтоговНаКонецПрошлогоПериода
   | -- Движения с конца прошлого периода до даты
   |    UNION ALL
   |    SELECT
   |        Движения.Поставщик,
   |        Движения.Договор,
   |        Движения.Вагон,
   |        Движения.Автомобиль,
   |        Движения.Количество * (1 - Движения.debkred * 2)
   |
   |    FROM
   |        [Регистр.Авто_ВДороге] Движения
   |    WHERE Движения.date BETWEEN :ДатаНачалаПериодаДвижений and :КонПериод
   |    )
   |    LEFT JOIN
   |        (
   |        SELECT    
   |            DocTAB_2012.Вариант AS [Вариант $Справочник.Авто_Варианты]
   |        FROM [_1S.Const] as Период
   |            LEFT JOIN [ДокументСтроки.ВАИ_ДанныеВБазу_2012] As DocTAB_2012 on DocTAB_2012.LINENO = Период.LINENO and DocTAB_2012.IDDOC = Период.DOCID
   |        WHERE Период.id = :ИсторияРеквизита.Автомобили.Загружен and Период.objid = Остатки.Автомобиль
   |        )
   |Остатки GROUP BY Остатки.Поставщик, Остатки.Договор, Остатки.Вагон, Остатки.Автомобиль
   |HAVING SUM(Остатки.Количество) <> 0
   |";
1 Mikeware
 
08.10.12
15:05
бред какой-то
2 Zhuravlik
 
08.10.12
15:08
По отдельности работает, единственно что когда узнаю характеристики - подставляю элемент справочника в запрос (":Авто"), в условие
WHERE Период.id = :ИсторияРеквизита.Автомобили.Загружен and Период.objid = :Авто
А здесь пишу Период.objid = Остатки.Автомобиль
3 Mikeware
 
08.10.12
15:10
ну и обхови как-нибудб юнион, и обращайса по этому алиасу...
4 mikecool
 
08.10.12
15:10
алиас первой таблицы накуа второй подсунул?
5 mikecool
 
08.10.12
15:12
приучился бы перед алиасами писать AS - понятней самому было бы намного
6 Zhuravlik
 
08.10.12
15:16
(4) А как мне в фильтр установить на те авто, которые я получаю с итогов? Я подумал, что так...
7 Zhuravlik
 
08.10.12
15:17
(3) Не понял(
8 Mikeware
 
08.10.12
15:17
(6) ну почитай ты учебник по SQL, вместо того, чтоб методом тыка делать...
9 mikecool
 
08.10.12
15:18
(6) какой на.уй фильтр? посмотри к чему у тебя привязан алиас Остатки и поймешь суть ошибки
10 Zhuravlik
 
08.10.12
15:26
(8) http://de.ifmo.ru/--books/sql/ - до дыр, но чот туплю...
(9) Кажется догнал до кой-чего, спасибо) Я по неопытности думал, что
"Остатки Group BY..." - это одна конструкция, но Остатки - Это алиас для From... Глупо очень, понял) Буду пробовать дальше, спасибо.
11 Zhuravlik
 
08.10.12
15:29
Сделал)

   ТекстЗапрос_АЛЛ = "
   |SELECT
   |    Остатки.Поставщик [Поставщик $Справочник.Контрагенты],
   |    Остатки.Договор [Договор $Справочник.Договор],
   |    Остатки.Вагон [Вагон],
   |    Остатки.Автомобиль [Автомобиль $Справочник.Автомобили],
   |    DocTAB_2012.Вариант AS [Вариант $Справочник.Авто_Варианты],
   |    SUM (Остатки.Количество) [Количество $Число]
   |FROM
   |    (
   | -- Итоги на конец предыдущего периода
   |    SELECT
   |        Итоги.Поставщик Поставщик,
   |        Итоги.Договор Договор,
   |        Итоги.Вагон Вагон,
   |        Итоги.Автомобиль Автомобиль,
   |        Итоги.Количество Количество
   |    FROM
   |        [РегистрИтоги.Авто_ВДороге] Итоги
   |    WHERE
   |        Итоги.period = :ДатаИтоговНаКонецПрошлогоПериода
   | -- Движения с конца прошлого периода до даты
   |    UNION ALL
   |    SELECT
   |        Движения.Поставщик,
   |        Движения.Договор,
   |        Движения.Вагон,
   |        Движения.Автомобиль,
   |        Движения.Количество * (1 - Движения.debkred * 2)
   |
   |    FROM
   |        [Регистр.Авто_ВДороге] Движения
   |    WHERE Движения.date BETWEEN :ДатаНачалаПериодаДвижений and :КонПериод
   |    ) Остатки, [_1S.Const] as Период
   |LEFT JOIN [ДокументСтроки.ВАИ_ДанныеВБазу_2012] As DocTAB_2012 on DocTAB_2012.LINENO = Период.LINENO and DocTAB_2012.IDDOC = Период.DOCID
   |
   |WHERE Период.id = :ИсторияРеквизита.Автомобили.Загружен and Период.objid = Остатки.Автомобиль
   |
   |GROUP BY Остатки.Поставщик, Остатки.Договор, Остатки.Вагон, Остатки.Автомобиль, DocTAB_2012.Вариант
   |HAVING SUM(Остатки.Количество) <> 0
   |";    


Спасибо за помощь)
12 Zhuravlik
 
08.10.12
15:38
А такой момент не объясните? В конструкции GROUP BY указываются все переменные SELECT, кроме функций (или как-то по другому определение звучит), а как туда добавить COALESCE? Дело в том, что будут операторы в SELECTE такие -
COALESCE(DocTAB_2009.Вариант, DocTAB_2010.Вариант, DocTAB_2011.Вариант, DocTAB_2012.Вариант, DocTAB_2013.Вариант) AS [Вариант $Справочник.Авто_Варианты]
13 Zhuravlik
 
08.10.12
15:42
COALESCE тоже функция... ужас, каша в голове...
14 Ёпрст
 
08.10.12
15:44
вот её туда же и пихай.
15 Ёпрст
 
08.10.12
15:45
COALESCE - это не агрегатная функция, это заменитель Case
16 Ёпрст
 
08.10.12
15:45
и её смело можно пихать в group by
17 Zhuravlik
 
08.10.12
15:47
(16) Возможно глупость скажу, но если не скажу не вкурю. Сейчас прописал без нее, все прокатило, а зачем ее туда пихать тогда?
И если все-таки пихать, то как? Алиасом, или всю эту строчку овер 100 символов писать в групп би?
18 Mikeware
 
08.10.12
15:49
(12) в group by "пихаются" измерения без агрегатных функций.
это те переменные, по которым ты "сворачиваешь" результат запроса.
а агрегатных функций - всего ничего - сум, мин, макс, авг, стандартные отклонения и т.п.
19 Ёпрст
 
08.10.12
15:54
(17) скажи спасибо, что 1sqlite не ругается матом  при таких действиях, он просто потом тихо мстит тебе медленным выполнением запроса.
20 Ёпрст
 
08.10.12
15:55
+19 писать всё тоже, что и в селек листе без псевдонима столбца.
21 Zhuravlik
 
08.10.12
16:05
(19) Ды уж лучше бы ругался тогда)))
(20) Страсть....
Проблемы невозможно решaть нa том же уровне компетентности, нa котором они возникaют. Альберт Эйнштейн