Имя: Пароль:
1C
1C 7.7
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