|
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) Страсть.... |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |