|
v7: Выборка прямым запросом за текущий период | ☑ | ||
---|---|---|---|---|
0
pilot 560
17.07.13
✎
10:32
|
Вот такой запрос делаю посредством 1С++:
| (SELECT | CASE WHEN | РегСН.debkred = 0 | THEN | $РегСН.Товар | ELSE | $ПустойИД | END as ТоварВх, | CASE WHEN | РегСН.debkred = 1 | THEN | $РегСН.Товар | ELSE | $ПустойИД | END as ТоварИсх, | CASE WHEN | РегСН.debkred = 0 | THEN | $РегСН.СерийныйНомер | ELSE | $ПустойИД | END as СерийныйНомерВх, | CASE WHEN | РегСН.debkred = 1 | THEN | $РегСН.СерийныйНомер | ELSE | $ПустойИД | END as СерийныйНомерИсх, | РегСН.iddoc as ИДДокумента, | РегСН.iddocdef as ВидДокумента, | $РасходнаяНакладная.Клиент AS Покупатель, | $ПриходнаяНакладная.Клиент AS Поставщик, | sum(case when РегСН.debkred = 0 then $РегСН.Количество else 0 end) as КоличествоПриход, | sum(case when РегСН.debkred = 1 then $РегСН.Количество else 0 end) as КоличествоРасход | FROM $Регистр.СерийныеНомера as РегСН (nolock) | LEFT JOIN $Документ.РасходнаяНакладная AS РасходнаяНакладная With (NOLOCK) ON (РасходнаяНакладная.IDDOC = РегСН.iddoc) | LEFT JOIN $Документ.ПриходнаяНакладная AS ПриходнаяНакладная With (NOLOCK) ON (ПриходнаяНакладная.IDDOC = РегСН.iddoc) | LEFT JOIN $Документ.АктТехКонтроля AS АктТехКонтроля With (NOLOCK) ON $АктТехКонтроля.Товар = $РегСН.Товар | INNER JOIN $ДокументСтроки.АктТехКонтроля AS АктТехКонтроляСтроки With (NOLOCK) ON АктТехКонтроля.IDDOC = АктТехКонтроляСтроки.IDDOC | where | LEFT(РегСН.date_time_iddoc, 8) >= :НачДата and | LEFT(РегСН.date_time_iddoc, 8) <= :КонДата"+СтрокаФильтров+" | group by | CASE WHEN | РегСН.debkred = 0 | THEN | $РегСН.Товар | ELSE | $ПустойИД | END, | CASE WHEN | РегСН.debkred = 1 | THEN | $РегСН.Товар | ELSE | $ПустойИД | END, | CASE WHEN | РегСН.debkred = 0 | THEN | $РегСН.СерийныйНомер | ELSE | $ПустойИД | END, | CASE WHEN | РегСН.debkred = 1 | THEN | $РегСН.СерийныйНомер | ELSE | $ПустойИД | END, | РегСН.iddocdef, | РегСН.iddoc, | $РасходнаяНакладная.Клиент, | $ПриходнаяНакладная.Клиент | having | sum(case when РегСН.debkred = 0 then $РегСН.Количество else 0 end) <> 0 or | sum(case when РегСН.debkred = 1 then $РегСН.Количество else 0 end) <> 0 | ) as СерийныеНомераОбороты На сервер уходит вот это: (SELECT CASE WHEN РегСН.debkred = 0 THEN РегСН.sp5308 ELSE ' 0 ' END as ТоварВх, CASE WHEN РегСН.debkred = 1 THEN РегСН.sp5308 ELSE ' 0 ' END as ТоварИсх, CASE WHEN РегСН.debkred = 0 THEN РегСН.sp5310 ELSE ' 0 ' END as СерийныйНомерВх, CASE WHEN РегСН.debkred = 1 THEN РегСН.sp5310 ELSE ' 0 ' END as СерийныйНомерИсх, РегСН.iddoc as ИДДокумента, РегСН.iddocdef as ВидДокумента, РасходнаяНакладная.sp413 AS Покупатель, ПриходнаяНакладная.sp437 AS Поставщик, sum(case when РегСН.debkred = 0 then РегСН.sp5311 else 0 end) as КоличествоПриход, sum(case when РегСН.debkred = 1 then РегСН.sp5311 else 0 end) as КоличествоРасход FROM ra5312 as РегСН (nolock) LEFT JOIN dh410 AS РасходнаяНакладная With (NOLOCK) ON (РасходнаяНакладная.IDDOC = РегСН.iddoc) LEFT JOIN dh434 AS ПриходнаяНакладная With (NOLOCK) ON (ПриходнаяНакладная.IDDOC = РегСН.iddoc) LEFT JOIN dh4876 AS АктТехКонтроля With (NOLOCK) ON АктТехКонтроля.sp4880 = РегСН.sp5308 INNER JOIN dt4876 AS АктТехКонтроляСтроки With (NOLOCK) ON АктТехКонтроля.IDDOC = АктТехКонтроляСтроки.IDDOC where LEFT(РегСН.date_time_iddoc, 8) >= '20130601' and LEFT(РегСН.date_time_iddoc, 8) <= '20130730' group by CASE WHEN РегСН.debkred = 0 THEN РегСН.sp5308 ELSE ' 0 ' END, CASE WHEN РегСН.debkred = 1 THEN РегСН.sp5308 ELSE ' 0 ' END, CASE WHEN РегСН.debkred = 0 THEN РегСН.sp5310 ELSE ' 0 ' END, CASE WHEN РегСН.debkred = 1 THEN РегСН.sp5310 ELSE ' 0 ' END, РегСН.iddocdef, РегСН.iddoc, РасходнаяНакладная.sp413, ПриходнаяНакладная.sp437 having sum(case when РегСН.debkred = 0 then РегСН.sp5311 else 0 end) <> 0 or sum(case when РегСН.debkred = 1 then РегСН.sp5311 else 0 end) <> 0 ) as СерийныеНомераОбороты в выборке данные есть только за предыдущие периоды. Т.е. движения, сделанные текущим месяцем в выборку не попадают, но в таблице они точно есть. Регистр выставлен в остатки + галка на быструю обработку движений. |
|||
1
nicxxx
17.07.13
✎
10:49
|
может это влияет: INNER JOIN dt4876 AS АктТехКонтроляСтроки?
возможно, нет таких записей в регистре |
|||
2
Mikeware
17.07.13
✎
10:52
|
(1) ну дык! если нет ножек - нет и мультиков
|
|||
3
pilot 560
17.07.13
✎
10:55
|
блин, а и правда! Но мне это объединение нужно для последующих условий... Значит придется изыскать другие фонды
|
|||
4
nicxxx
17.07.13
✎
10:55
|
LEFT JOIN спасет отца русской демократии
|
|||
5
nicxxx
17.07.13
✎
10:56
|
и вобще, перед INNER стоит три LEFT джойна, чего тебя понесло на внутреннее соединение в четвертом случае?
|
|||
6
Mikeware
17.07.13
✎
10:57
|
(3) это не ОБЪединение, а СОединение....
называй вещи своими именами |
|||
7
pilot 560
17.07.13
✎
11:03
|
(6) ну извините! )
(4), (5) да, что-то меня переклинило, что последний джойн должен идти к предыдущему LEFT. Понял, что был не прав |
|||
8
Ёпрст
17.07.13
✎
11:18
|
вот это выкини из селекта и из хавинга
case when РегСН.debkred = 0 then $РегСН.Количество else 0 end будь проще, используй операцию умножения. |
|||
9
Mikeware
17.07.13
✎
11:27
|
(8) ну это ж математику вспоминать надо. 2-й класс... кому это надо?
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |