|
v7: Вопрос по Запросу 1С++ | ☑ | ||
---|---|---|---|---|
0
FobusVGrunt
02.02.16
✎
12:40
|
Нужно получить таблицу с колонками "Клиент" и "Отгружено". В колонке "Отгрузки", нужна сумма отгрузки за минусом возвратов. Отгрузка выбираю из документа "НакладнаяТоварыОпт", а возвраты "НакладнаяТоварыВозвратОпт". Проблема как сгруппировать это в запросе:
ТекстЗапроса = "SELECT |CASE Журнал.IDDOCDEF | WHEN :ВидДокумента.НакладнаяТоварыОпт THEN Док.Контрагент | WHEN :ВидДокумента.НакладнаяТоварыВозвратОпт THEN ДокВозвр.Контрагент | END AS [Клиент $Справочник.Контрагенты], |CASE Журнал.IDDOCDEF | WHEN :ВидДокумента.НакладнаяТоварыОпт THEN SUM(Док.СуммаСНДС) | WHEN :ВидДокумента.НакладнаяТоварыВозвратОпт THEN SUM(-ДокВозвр.СуммаСНДС) | END AS [Отгружено] |FROM [_1S.JOURN] as Журнал |LEFT JOIN [Документ.НакладнаяТоварыОпт] AS Док ON Журнал.IDDOC = Док.IDDOC |LEFT JOIN [Документ.НакладнаяТоварыОпт] AS ДокВозвр ON Журнал.IDDOC = ДокВозвр.IDDOC |WHERE (Журнал.IDDOCDEF IN (:ВидДокумента.НакладнаяТоварыОпт,:ВидДокумента.НакладнаяТоварыВозвратОпт)) |AND (Журнал.Date between :НачДата and :КонДата~) AND (Журнал.Closed = 5) |AND ((Док.Контрагент IN " + СписокКлиентовВ1С + ") OR (ДокВозвр.Контрагент IN " + СписокКлиентовВ1С + ")) |GROUP BY Клиент-??? |"; Пишет ошибку, что колонка "Клиент" - нету, если указать Док.Контрагент или ДокВозвр.Контрагент -то неверно группирует |
|||
1
FobusVGrunt
02.02.16
✎
12:43
|
Выборку в Колонку "Клиент", беру из двух документов, как дать запросу понять, что и группировать ее одну. Еще было бы классно указать если это возможно и в операторе WHERE, что-то наподобие - Клиент IN " + СписокКлиентовВ1С + "
|
|||
2
FobusVGrunt
02.02.16
✎
12:44
|
(0) LEFT JOIN [Документ.НакладнаяТоварыВозвратОпт AS ДокВозвр, вместо LEFT JOIN [Документ.НакладнаяТоварыОпт] AS ДокВозвр ON Журнал.IDDOC = ДокВозвр.IDDOC!
|
|||
3
PRO100 NigGaZ
02.02.16
✎
12:46
|
НакладнаяТоварыОпт.Количество
union all -НакладнаяТоварыВозвратОпт.Количество |
|||
4
FobusVGrunt
02.02.16
✎
12:48
|
(3) Не совсем понятно два запроса делать вместо одного и объединять?
|
|||
5
Ёпрст
02.02.16
✎
12:51
|
(4) да
|
|||
6
Ёпрст
02.02.16
✎
12:55
|
и
|GROUP BY Клиент-??? заменить на |GROUP BY CASE Журнал.IDDOCDEF | WHEN :ВидДокумента.НакладнаяТоварыОпт THEN Док.Контрагент | WHEN :ВидДокумента.НакладнаяТоварыВозвратОпт THEN ДокВозвр.Контрагент | END |
|||
7
FobusVGrunt
02.02.16
✎
13:07
|
(6) Нет так, почему то игнорирует возвраты, как будто нет ничего из НакладнаяТоварыВозвратОпт
|
|||
8
Ёпрст
02.02.16
✎
13:09
|
(7) перенеси условие на клиентоса в место соединения, в where оставь только фильтр на дату и на вид документа. Занимайся
|
|||
9
FIXXXL
02.02.16
✎
13:11
|
а есть регистр типа Продажи? или в 7-ке прямые запросы только на документах можно строить?
|
|||
10
Ёпрст
02.02.16
✎
13:11
|
ну и, для sqllite не надо делать :КонДата~, нужно :КонДата
+Журнал.Closed = 5 - это не верно. |
|||
11
FobusVGrunt
02.02.16
✎
13:13
|
(10) почему неверно?
|
|||
12
FobusVGrunt
02.02.16
✎
13:14
|
(9) Там компонента бух. учет, проще из док выбрать
|
|||
13
FobusVGrunt
02.02.16
✎
13:15
|
(9) Там компонента Бух. учет, проще через документ выбрать, чем к бухИтогам .
|
|||
14
FobusVGrunt
02.02.16
✎
13:17
|
Почему в запросе нельзя сгруппировать по колонке, выборка идет из нескольких таблиц в одну же колонку. Какой смысл указать в GROUP BY, одну из колонок таблиц выборки?
|
|||
15
Ёпрст
02.02.16
✎
13:18
|
(10)
почитай, что есть closed |
|||
16
Ёпрст
02.02.16
✎
13:19
|
(14) группируй, кто мешает ?
код в (6) |
|||
17
Ёпрст
02.02.16
✎
13:20
|
+16 если че, не все запросы позволяют в поле group by или order by использовать алияс поля из селекта.
|
|||
18
FobusVGrunt
02.02.16
✎
14:09
|
(15) closed - состояние документа, если 5-ть в компоненте БУ, означает документ проведен
|
|||
19
FobusVGrunt
02.02.16
✎
14:09
|
(16) так неверно группирует
|
|||
20
Mikeware
02.02.16
✎
14:42
|
(7)(19) ну так у тебя
|LEFT JOIN [Документ.НакладнаяТоварыОпт] AS Док ON Журнал.IDDOC = Док.IDDOC |LEFT JOIN [Документ.НакладнаяТоварыОпт] AS ДокВозвр ON Журнал.IDDOC = ДокВозвр.IDDOC |
|||
21
FobusVGrunt
02.02.16
✎
14:51
|
(20) я в (2) написал, что в (0) ошибку допустил, в самом запросе LEFT JOIN [Документ.НакладнаяТоварыВозвратОпт AS ДокВозвр ON Журнал.IDDOC = ДокВозвр.IDDOC.
|
|||
22
Mikeware
02.02.16
✎
14:52
|
(21) без группировки данные нормальные?
|
|||
23
Карупян
02.02.16
✎
15:02
|
делай через union
|
|||
24
Ёпрст
02.02.16
✎
15:04
|
(19) неверно, это как ?
|
|||
25
Ёпрст
02.02.16
✎
15:06
|
+ если делаешь group by, то в селекте пиши агрегатные функции для числовых полей.
А так, ежели 1sqlite не ругается на синтаксис, то это не значит, что это правильно - он просто "радугу" тебе возвращает в эти поля и привет, вот и видишь, не "те" циферки |
|||
26
varelchik
02.02.16
✎
15:12
|
смотри в сторону coalisce
|
|||
27
FobusVGrunt
02.02.16
✎
15:12
|
(24) Если группировать через CASE, вообще не попадают возвраты. Т.е. результирующая таблица только с суммами отгрузки, если например указать только "GROUP BY Док.Контрагент", то данные правильные, но Отгрузка и Возврат показывает в двух строках, т.е. не суммирует. Надо дополнительно сварачивать ТЗ еще, но в этом случаи вообще смысл группировки в запросе отсутствует, если надо сворачивать ТЗ. Пока убрал группировку из запроса и просто после выполнения сворачиваю ТЗ. Хотелось бы в запросе, но увы
|
|||
28
Mikeware
02.02.16
✎
15:24
|
(27) а если НЕ группировать? - суммы нормально? отдельно для продаж и для возвратов?
|
|||
29
Карупян
02.02.16
✎
15:24
|
CASE Журнал.IDDOCDEF
| WHEN :ВидДокумента.НакладнаяТоварыОпт THEN SUM(Док.СуммаСНДС) | WHEN :ВидДокумента.НакладнаяТоварыВозвратОпт THEN SUM(-ДокВозвр.СуммаСНДС) | END AS [Отгружено] а нужно SUM(CASE Журнал.IDDOCDEF | WHEN :ВидДокумента.НакладнаяТоварыОпт THEN Док.СуммаСНДС | WHEN :ВидДокумента.НакладнаяТоварыВозвратОпт THEN -ДокВозвр.СуммаСНДС | END) AS [Отгружено] |
|||
30
FobusVGrunt
02.02.16
✎
15:30
|
(29) О спасибо, теперь заработало, и Ёпрст - тоже спасибо, за CASE в GROUP BY
|
|||
31
FobusVGrunt
02.02.16
✎
15:32
|
А можно, еще как-то оптимизировать WHERE... ((Док.Контрагент IN " + СписокКлиентовВ1С + ") OR (ДокВозвр.Контрагент IN " + СписокКлиентовВ1С + "))
|
|||
32
Карупян
02.02.16
✎
15:35
|
(31) смотри (23)
|
|||
33
Mikeware
02.02.16
✎
15:35
|
(31) приджойнь справочник, и его сравннивай.
или попробуй в CASE Журнал.IDDOCDEF в where/// |
|||
34
Ёпрст
02.02.16
✎
16:41
|
(31) можно
ТекстЗапроса = " |SELECT | coalesce(Док.Контрагент,ДокВозвр.Контрагент) [Клиент :Справочник.Контрагенты], | sum(coalesce(Док.СуммаСНДС,-ДокВозвр.СуммаСНДС)) Отгружено |FROM [Журнал] as Журнал |LEFT JOIN [Документ.НакладнаяТоварыОпт] Док ON Журнал.IDDOC = Док.IDDOC |and Док.Контрагент IN (select val from СписокКлиентосов) |LEFT JOIN [Документ.НакладнаяТоварыВозвратОпт] ДокВозвр ON Журнал.IDDOC = ДокВозвр.IDDOC |and ДокВозвр.Контрагент IN (select val from СписокКлиентосов) |WHERE (Журнал.IDDOCDEF IN (:ВидДокумента.НакладнаяТоварыОпт,:ВидДокумента.НакладнаяТоварыВозвратОпт)) |AND (Журнал.Date between :НачДата and :КонДата) AND (Журнал.Closed > 0) | |GROUP BY coalesce(Док.Контрагент,ДокВозвр.Контрагент) |"; база.УложитьОбъекты(СписокКлиентосов,"СписокКлиентосов",0,"Контрагенты"); |
|||
35
FobusVGrunt
02.02.16
✎
17:09
|
(34) Спасибо попробую
|
|||
36
Djelf
02.02.16
✎
23:34
|
Свернуть по номеру колонки запроса? sqlite позволяет такое
GROUP BY 1 |
|||
37
FobusVGrunt
03.02.16
✎
14:12
|
(36) попробую спс Djelf
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |