Имя: Пароль:
1C
1C 7.7
v7: Разница таблиц
0 yanejsh
 
08.11.11
11:24
Есть две таблицы. Товар - Количество
Как в первую таблицу добавить новую колонку с теми данными из второй, у которых количество больше, чем в первой. В том числе, если в первой их вообще не было.
Пример такой:
Таб1
Номенклатура  Количество
Пиво          2 шт
Зрелище       1 шт
Кот           2 шт

Таб2
Номенклатура  Количество
Пиво          3 шт
Зрелище       1 шт
Мясо          5 шт

Должна получится такая таб1:
Таб1
Номенклатура  Количество Кол1
Пиво          2 шт       1 шт
Зрелище       1 шт       0 шт
Кот           2 шт       0 шт
Мясо          0 шт       5 шт

уф... вроде как то так.
1 2S
 
08.11.11
11:26
перебор, сворачивание по "системной" колонке, поиск по значению
уф..как-то так
2 filh
 
08.11.11
11:29
перебор по 1 из таблиц + поиск в другой.
3 yanejsh
 
08.11.11
11:37
да, забыла. Эти две таблице получены в прямом запросе. Можно в запросе это реализовать?
4 Не Печенкин
 
08.11.11
11:38
странно, но мне кажется что строка должна быть:

Кот          -2 шт       0 шт
5 Ёпрст
 
08.11.11
11:38
(3) нужно.
6 Jaffar
 
08.11.11
11:41
(4) нет. я так понял, 1-я колонка - количество в 1-й таблице, 2-я колонка - превышение количества во 2-й над количеством в 1-й.
7 yanejsh
 
08.11.11
11:43
(5) а как?
(6) правильно понял
8 Ёпрст
 
08.11.11
11:48
(7)
обычное левое соединение 2-х таблиц по условию b.pole>a.pole
ну +coalesce туда в условие и в селект
9 yanejsh
 
08.11.11
11:54
нет, ну я не пойму. ведь как получается
если таб1 левое таб2 - то не попадет "мясо"(есть во второй но нет в первой)
если таб2 левое таб1 - то наоборот, не попадет то что есть в первой
хотя надо попробовать конечно
10 GreyK
 
08.11.11
12:02
(0) Добавить поле Количество2 в 1 таблицу, ну или в новую конию 1 таблицы,  в таблице 2 переименовать Количество в Количество2, подгрузить в 1 таблицу 2 тбалицу и свернуть по номенклатуре.
11 Ёпрст
 
08.11.11
12:08
(9)
select
 sum(t.k1)
,sum(t.k2)
,t.id
from
 (
   select
       a.kol k1
       ,-a.kol k2
       ,a.id id
   from a
   union all
   select
       0
       ,b.kol
       ,b.id
   from b )t
group by t.id
having sum(t.k2)>0
12 Jaffar
 
08.11.11
15:34
(11) запятая в начале строки - чтоб удобнее было закомментарить для отладки? :-)
13 yanejsh
 
08.11.11
15:35
я еще не попробовала, но обязательно скажу о результате :)
14 filh
 
08.11.11
15:53
(12) да
15 yanejsh
 
09.11.11
15:31
спасибо, все получилось :)
16 filh
 
09.11.11
15:32
(15) Тогда, пора бы уже и фотку сменить!
17 yanejsh
 
09.11.11
15:43
да не жалко :)
18 filh
 
09.11.11
15:44
(17) сама готовила?
19 yanejsh
 
09.11.11
15:47
ага
20 Креатив
 
09.11.11
17:08
(11)Есть мнение, что полным внешним соединением веселей будет.
21 yanejsh
 
09.11.11
22:15
(20) можешь пример привести?
22 Ёпрст
 
09.11.11
22:18
(20) неа.. там декартово произведение + добавление строк, а тут просто сложение + фильтр.. юнион быстрее по-любому
23 yanejsh
 
23.11.11
09:46
не могу понять.
некоторые товары с равным количеством в первой и второй таблице вылезают разными строчками.
то есть получилось такая штука:
Таблица 1
Номенклатура  К1 К2
Пиво          2  -2
Зрелище       1  -1
Таблица 2
Номенклатура  К1 К2
Пиво          0  2
Зрелище       0  1

После юнион и группировки получается:
Таблица
Номенклатура  К1 К2
Пиво          0  2
Зрелище       1  0
Пиво          2  -2
коды у первой и третьей строки одинаковые.
Может что-то с типизацией не так? но почему одни элементы дублируются, а другие нет
помогите...
24 Ёпрст
 
23.11.11
09:49
(23) нам отсюда не видно твой текст запроса
25 yanejsh
 
23.11.11
09:58
он в (11) только без having sum
26 Ёпрст
 
23.11.11
10:10
(25) ну тогда на вопрос "очему одни элементы дублируются, а другие нет "
ответ один - это разные элементы с одинаковым наименованием
27 yanejsh
 
23.11.11
10:16
это одинаковые элементы. это точно.
после выгрузки результата в таблицу значений и группировка ее - остается один элемент
28 Ёпрст
 
23.11.11
10:17
(27) ну тогда, текст запроса в студию.
29 yanejsh
 
23.11.11
10:21
ТекстЗапроса = "
   |Select
   |    t.Подразделение [Подразделение $Справочник.Подразделения]
   |    , t.Продукция [Продукция $Справочник.Номенклатура]
   |    , t.ТипНоменклатуры [ТипНоменклатуры $Перечисление.ТипыНоменклатуры]
   |    , t.ВидПродукции [ВидПродукции $Справочник.ВидыНоменклатуры]
   |    , t.КоличествоНоменклатуры as КоличествоНоменклатуры
   |    , t.ЕдИзмНомен [ЕдИзмНомен $Справочник.ЕдиницыИзмерений]
   |    , t.Материал [Материал $Справочник]
   |    , sum(t.СуммаМатериала) As СуммаМатериала
   |    , sum(t.СуммаМатериалаУтил) As СуммаМатериалаУтил
   |    , sum(t.КолМатОсв) as КолМатОсв
   |    , (Case When sum(t.КолМатУтил)<0 Then 0 Else sum(t.КолМатУтил) End) as КолМатУтил
   |From (
   |SELECT Подразделения.ID as Подразделение
   |        , Номенклатура.ID as Продукция
   |        , $Номенклатура.ТипНоменклатуры as ТипНоменклатуры
   |        , ВидыНоменклатуры.ID as ВидПродукции
   |        , (Case When IsNULL(РазделкаСтроки.LineNo_,1) = 1 Then $Разделка.КоличествоСырья  Else 0 End) as КоличествоНоменклатуры
   |        , $Номенклатура.ЕдиницаИзмерения as ЕдИзмНомен
   |        , $РазделкаСтроки.Выход as Материал
   |        , $РазделкаСтроки.Количество as КолМатОсв
   |        , -$РазделкаСтроки.Количество as КолМатУтил
   |        , ПодзапросСумма.Сумма as СуммаМатериала
   |        , 0 as СуммаМатериалаУтил
   |    FROM $Документ.Разделка AS Разделка With (NOLOCK)
   |        INNER JOIN _1SJOURN AS Журнал With (NOLOCK) ON Разделка.IDDOC = Журнал.IDDOC
   |        LEFT OUTER JOIN $Справочник.Номенклатура AS Номенклатура With (NOLOCK) ON $Разделка.Сырье = $ВидСправочника36.Номенклатура + Номенклатура.ID
   |        LEFT OUTER JOIN $Справочник.Подразделения AS Подразделения With (NOLOCK) ON $Разделка.Подразделение = Подразделения.ID
   |        LEFT OUTER JOIN $Справочник.ВидыНоменклатуры AS ВидыНоменклатуры With (NOLOCK) ON $Номенклатура.ВидНоменклатуры = ВидыНоменклатуры.ID
   |        LEFT OUTER JOIN $ДокументСтроки.Разделка AS РазделкаСтроки With (NOLOCK) ON Разделка.IDDOC = РазделкаСтроки.IDDOC
   |        LEFT OUTER JOIN (SELECT ПроизводственныеЗатраты.IDDOC Документ
   |                , $ПроизводственныеЗатраты.Затрата Затрата
   |                , $ПроизводственныеЗатраты.Продукция Продукция
   |                , $ПроизводственныеЗатраты.Сумма Сумма
   |            FROM $Регистр.ПроизводственныеЗатраты AS ПроизводственныеЗатраты With (NOLOCK)) AS ПодзапросСумма ON Разделка.IDDOC = ПодзапросСумма.Документ AND $РазделкаСтроки.Выход = ПодзапросСумма.Затрата
   |    WHERE (Cast(Left(Журнал.DATE_TIME_IDDOC, 8) AS datetime) >= :ДатаНач)
   |        AND (Cast(Left(Журнал.DATE_TIME_IDDOC, 8) AS datetime) <= :ДатаКон)
   |        AND ((Журнал.CLOSED & 1) = 1)
   |        AND (1=1)
   |        AND (2=2)
   |        AND (3=3)
   |        AND (4=4)
   |Union ALL
   |SELECT Подразделения.ID as Подразделение
   |        , Номенклатура.ID as Продукция
   |        , $Номенклатура.ТипНоменклатуры as ТипНоменклатуры
   |        , ВидыНоменклатуры.ID as ВидПродукции
   |        , 0 as КоличествоНоменклатуры
   |        , $Номенклатура.ЕдиницаИзмерения as ЕдИзмНомен
   |        , НормыМатериалов.ЭлементМатериал as Материал
   |        , 0 as КолМатОсв
   |        , ($Разделка.КоличествоСырья * НормыМатериалов.Норма) as КолМатУтил
   |        , 0 as СуммаМатериала
   |        , (ПодзапросПлановаяЦена.Цена * ($Разделка.КоличествоСырья * НормыМатериалов.Норма)) as СуммаМатериалаУтил
   |    FROM $Документ.Разделка AS Разделка With (NOLOCK)
   |        INNER JOIN _1SJOURN AS Журнал With (NOLOCK) ON Разделка.IDDOC = Журнал.IDDOC
   |        LEFT OUTER JOIN $Справочник.Номенклатура AS Номенклатура With (NOLOCK) ON $Разделка.Сырье = $ВидСправочника36.Номенклатура + Номенклатура.ID
   |        LEFT OUTER JOIN $Справочник.Подразделения AS Подразделения With (NOLOCK) ON $Разделка.Подразделение = Подразделения.ID
   |        LEFT OUTER JOIN $Справочник.ВидыНоменклатуры AS ВидыНоменклатуры With (NOLOCK) ON $Номенклатура.ВидНоменклатуры = ВидыНоменклатуры.ID
   |        LEFT OUTER JOIN
   |        (SELECT НормыРасходов.PARENTEXT [Владелец]
   |                , $НормыРасходов.ВидЭлемента [ВидЭлемента]
   |                , $НормыРасходов.Элемент [ЭлементМатериал]
   |                , $ПоследнееЗначение.НормыРасходов.Норма(НормыРасходов.ID, :ДатаНач ) AS Норма
   |        FROM $Справочник.НормыРасходов AS НормыРасходов With (NOLOCK)
   |        WHERE ($ПоследнееЗначение.НормыРасходов.Норма(НормыРасходов.ID, :ДатаНач) <> 0)
   |                AND (НормыРасходов.ISMARK = 0) ) AS НормыМатериалов ON НормыМатериалов.Владелец=Номенклатура.ID
   |        
   |        LEFT OUTER JOIN
   |        (SELECT $ПлановыеЦеныМатериалов.Материал [Материал]
   |                    , $ПлановыеЦеныМатериалов.Цена [Цена]
   |        FROM $Регистр.РегистрСведенийПлановыеЦеныМатериалов AS ПлановыеЦеныМатериалов With (NOLOCK)
   |        WHERE ($ПлановыеЦеныМатериалов.ТипЦен = :ТипЦен)
   |                    and ПлановыеЦеныМатериалов.DATE_TIME_IDDOC =
   |                        (select top 1 План.DATE_TIME_IDDOC from $Регистр.РегистрСведенийПлановыеЦеныМатериалов План (nolock)
   |                             where  $План.Материал = $ПлановыеЦеныМатериалов.Материал
   |                            order by Cast(Left(План.DATE_TIME_IDDOC, 8) as datetime) desc) ) AS ПодзапросПлановаяЦена ON НормыМатериалов.ЭлементМатериал = $ВидСправочника36.Материалы + ПодзапросПлановаяЦена.Материал
   |
   |    WHERE (Cast(Left(Журнал.DATE_TIME_IDDOC, 8) AS datetime) >= :ДатаНач)
   |        AND (Cast(Left(Журнал.DATE_TIME_IDDOC, 8) AS datetime) <= :ДатаКон)
   |        AND ((Журнал.CLOSED & 1) = 1)
   |        AND (1=1)
   |        AND (2=2)
   |        AND (3=3)
   |        AND (4=4)
   |  ) AS t
   |group by
   |    t.Подразделение, t.Продукция, t.ТипНоменклатуры, t.ВидПродукции, t.КоличествоНоменклатуры, t.ЕдИзмНомен, t.Материал
   |";
30 Ёпрст
 
23.11.11
10:26
|        AND (1=1)
   |        AND (2=2)
   |        AND (3=3)
   |        AND (4=4)

Это нафига ? :)
31 Ёпрст
 
23.11.11
10:28
>= :ДатаНач)
   |        AND

заместо этого используй between
32 yanejsh
 
23.11.11
10:29
(30) ну это типо отборы могут быть по номенклатуре и прочему
33 Ёпрст
 
23.11.11
10:31
А так, надо всё переписывать
34 yanejsh
 
23.11.11
10:33
(33) эээ, а что не так? в принципе если поставить вместо
(Case When sum(t.КолМатУтил)<0 Then 0 Else sum(t.КолМатУтил) End) as КолМатУтил
строку
sum(t.КолМатУтил) as КолМатУтил
то результат более походил бы на правду, но будет позиции в таблице КолМатУтил<0 а мне вместо таких нужен 0. может потом обойти таблицу и поменять КолМатУтил<0 на КолМатУтил=0?
35 yanejsh
 
23.11.11
10:46
все? бесплатные советы кончились?
36 viktor_vv
 
23.11.11
10:52
(35) Много букв в (29) :). Не относящееся к теме, замени

(Cast(Left(Журнал.DATE_TIME_IDDOC, 8) AS datetime) >= :ДатаНач)
   |        AND (Cast(Left(Журнал.DATE_TIME_IDDOC, 8) AS datetime) <= :ДатаКон)

на

|Журнал.DATE_TIME_IDDOC between :ДатаНач and :ДатаКон~
37 yanejsh
 
23.11.11
10:56
(36) ну как бы результат то все равно тот же самый
38 VladZ
 
23.11.11
10:59
Женя, солнышко, верни кровать...
39 yanejsh
 
23.11.11
11:02
(38) это как то поможет в решении проблемы?
40 viktor_vv
 
23.11.11
11:02
(37) Ну я же предупредил, что не по теме :).

Сделай как в (34) меняешь и срерху еще один Select наверни, а там уже Case.
41 yanejsh
 
23.11.11
11:07
(40) я пробовала, результат такой же.
мне все кажется тут из-за типов что-то не так. почему то в запросе group by не группирует одинаковые элементы, а ИТЗ.Группировать - группирует.
42 Злой Бобр
 
23.11.11
11:07
(35) Правильный ответ в (33).
И что это за хрень:
   |        AND (1=1)
   |        AND (2=2)
   |        AND (3=3)
   |        AND (4=4)
43 yanejsh
 
23.11.11
11:10
(42)
   Если ФлажокУсловие3=1 Тогда //по списку типов номенклатуры
       Если СписокУсловие3.РазмерСписка() > 0 Тогда    
           ТекстЗапроса=СтрЗаменить(ТекстЗапроса,"3=3","$Номенклатура.ТипНоменклатуры IN (SELECT Val from #СписокТиповНомен)");
           Запрос.УложитьСписокОбъектов(СписокУсловие3, "#СписокТиповНомен");
       КонецЕсли;
   Иначе
       Если МоноУсловие3.Выбран()=1 Тогда
           ТекстЗапроса=СтрЗаменить(ТекстЗапроса,"3=3","$Номенклатура.ТипНоменклатуры = :ВыбТипНомен");
           Запрос.УстановитьТекстовыйПараметр("ВыбТипНомен", МоноУсловие3);
       КонецЕсли;    
   КонецЕсли;

что именно переписывать? и главное как?
Чтобы переписать - надо понимать, почему не так получается. я вот не понимаю.
это легче всего сказать: "Надо все переписать". это я тоже могу сказать.
можно добавить чуть больше конкретики?
44 viktor_vv
 
23.11.11
11:14
(41) А в ИТЗ строку группировки ты как пишешь с "*" или без ?
45 Креатив
 
23.11.11
11:15
(22)Либо я чего-то забыл, либо всё-таки соединение работает быстрее.
(21)
Что-то типа
выбрать
  выбор
   когда т1.номенклатура = null тогда т2.номенклатура
   когда т2.номенклатура = null тогда т1.номенклатура
  конец как товар,
  выбор
   когда т1.количество = null тогда 0
   когда т1.количество <> null тогда т1.количество
  конец как колво1,
  (выбор
   когда т2.количество = null тогда 0
   когда т2.количество <> null тогда т2.количество
  конец
  -
  выбор
   когда т1.количество = null тогда 0
   когда т1.количество <> null тогда т1.количество
  конец ) как колво2
из
  (выбрать номенклатура, количество
  из
  таб1
  ) как т1
  внешнее соединение
  (выбрать номенклатура, количество
  из
  таб2
  ) как т2
  по т1.номенклатура = т2.номенклатура
Синтаксис отвязный, но смысл должен быть понятен.
46 viktor_vv
 
23.11.11
11:17
Вот здесь проверь типы  $РазделкаСтроки.Выход as Материал  и НормыМатериалов.ЭлементМатериал as Материал

На предмет справочника общего вида.
47 yanejsh
 
23.11.11
11:18
(44) без "*"
а что дает "*"?
48 viktor_vv
 
23.11.11
11:19
(46) А еще выведи в ТЗ без типизации и посомтри идентификаторы.
49 Злой Бобр
 
23.11.11
11:29
(43) Прикольный метод написания кода. За такое нужно *** сразу отрывать. Но это лично мое мнение. Тех кому нравится гланды через *** это никак некасается.
ТекстЗапроса = "
   |...
   |";
Если ... Тогда
   ТекстЗапроса = ТекстЗапроса + "
       |...
       |";
Иначе
   ТекстЗапроса = ТекстЗапроса + "
       |...
       |";
КонецЕсли;
ТекстЗапроса = ТекстЗапроса + "
   |...
   |";
По крайней мере при таком подходе по ходу текста запроса хоть понятно что к чему.

Зачем использовать документы и регистры. Тянуть только из регистров никак? Сильно в текст невчитывался.
По отдельности запросы выдают правильные данные? Если да то смотрите в типизацию справочников, где-то есть неопределенного вида.
50 yanejsh
 
23.11.11
11:37
(49) мне так не нравится. нагляднее когда запрос целиком видно
плохо, что в подзапросах я не могу типизировать нужные мне переменные. По отдельности все правильно. дальше нужно сложить и группировать.
(48) идентификаторы одинаковы
51 Креатив
 
23.11.11
11:41
(50)А мою пародию на запрос читала?
52 Ёпрст
 
23.11.11
11:44
(34) у тебя нелепое соединение подзапроса в котором селект к регистру, это раз.
53 yanejsh
 
23.11.11
11:44
(51) плохо понимаю, что ты написал :)
54 VladZ
 
23.11.11
11:45
(39) А текущая картинка способствует? :)
55 VladZ
 
23.11.11
11:45
(0) Начни сначала: зачем тебе это?
56 Креатив
 
23.11.11
11:49
(53)Если SQL знаешь, то выбрать-select, выбор-case. из-from и т.д.
Сама идея проста. Делаешь полное внешнее соединение таблиц (full outer join) по номенклатуре. Из получившейся таблицы выбираешь номенклатуру, где она отлична от null, если какое-то количество равно null, то меняешь на 0. Ну и вычитаешь из второго количество первое.
57 Ёпрст
 
23.11.11
11:54
(56) любое соединение всегда медленнее чем union all
58 yanejsh
 
23.11.11
11:58
здесь что не так?
   ТекстЗапроса = "
   |Select
   |    t.Продукция [Продукция $Справочник.Номенклатура]
   |    , t.КоличествоНоменклатуры as КоличествоНоменклатуры
   |    , t.Материал [Материал $Справочник]
   |    , sum(t.КолМатОсв) as КолМатОсв
End) as КолМатУтил
   |    , sum(t.КолМатУтил) as КолМатУтил
   |From (
   |SELECT Номенклатура.ID as Продукция
   |        , (Case When IsNULL(РазделкаСтроки.LineNo_,1) = 1 Then $Разделка.КоличествоСырья  Else 0 End) as КоличествоНоменклатуры
   |        , $РазделкаСтроки.Выход as Материал
   |        , $РазделкаСтроки.Количество as КолМатОсв
   |        , -$РазделкаСтроки.Количество as КолМатУтил
   |    FROM $Документ.Разделка AS Разделка With (NOLOCK)
   |        INNER JOIN _1SJOURN AS Журнал With (NOLOCK) ON Разделка.IDDOC = Журнал.IDDOC
   |        LEFT OUTER JOIN $Справочник.Номенклатура AS Номенклатура With (NOLOCK) ON $Разделка.Сырье = $ВидСправочника36.Номенклатура + Номенклатура.ID
   |        LEFT OUTER JOIN $ДокументСтроки.Разделка AS РазделкаСтроки With (NOLOCK) ON Разделка.IDDOC = РазделкаСтроки.IDDOC
   |    WHERE (Журнал.DATE_TIME_IDDOC between :ДатаНач and :ДатаКон~)
   |        AND ((Журнал.CLOSED & 1) = 1)
   |        AND (Номенклатура.ID = :ВыбНоменклатура)
   |Union ALL
   |SELECT Номенклатура.ID as Продукция
   |        , 0 as КоличествоНоменклатуры
   |        , НормыМатериалов.ЭлементМатериал as Материал
   |        , 0 as КолМатОсв
   |        , ($Разделка.КоличествоСырья * НормыМатериалов.Норма) as КолМатУтил
   |    FROM $Документ.Разделка AS Разделка With (NOLOCK)
   |        INNER JOIN _1SJOURN AS Журнал With (NOLOCK) ON Разделка.IDDOC = Журнал.IDDOC
   |        LEFT OUTER JOIN $Справочник.Номенклатура AS Номенклатура With (NOLOCK) ON $Разделка.Сырье = $ВидСправочника36.Номенклатура + Номенклатура.ID
   |        LEFT OUTER JOIN
   |        (SELECT НормыРасходов.PARENTEXT [Владелец]
   |                , $НормыРасходов.ВидЭлемента [ВидЭлемента]
   |                , $НормыРасходов.Элемент [ЭлементМатериал]
   |                , $ПоследнееЗначение.НормыРасходов.Норма(НормыРасходов.ID, :ДатаНач ) AS Норма
   |        FROM $Справочник.НормыРасходов AS НормыРасходов With (NOLOCK)
   |        WHERE ($ПоследнееЗначение.НормыРасходов.Норма(НормыРасходов.ID, :ДатаНач) <> 0)
   |                AND (НормыРасходов.ISMARK = 0) ) AS НормыМатериалов ON НормыМатериалов.Владелец=Номенклатура.ID
   |
   |    WHERE (Журнал.DATE_TIME_IDDOC between :ДатаНач and :ДатаКон~)
   |        AND ((Журнал.CLOSED & 1) = 1)
   |        AND (Номенклатура.ID = :ВыбНоменклатура)
   |  ) AS t
   |group by
   |    t.Продукция, t.КоличествоНоменклатуры, t.Материал
   |";
59 Креатив
 
23.11.11
12:02
(57)Возможно, но после union нужна обязательная группировка. Что тоже отнимает время. Но я не специалист по SQL, поэтому дальше спорить не буду.
60 Ёпрст
 
23.11.11
12:06
(58) для начала, выкинуть соединение со справочником Номенклатура.
61 viktor_vv
 
23.11.11
12:27
(58)  |group by
   |    t.Продукция, t.КоличествоНоменклатуры, t.Материал

У тебя во втором union КоличествоНоменклатуры =0 , а в первом не равно 0. Соответственно не сгруппирует в одну стрроку.
62 yanejsh
 
23.11.11
12:30
(60) пока все то же
   ТекстЗапроса = "
   |Select
   |    t.Продукция [Продукция $Справочник]
   |    , t.КоличествоНоменклатуры as КоличествоНоменклатуры
   |    , t.Материал [Материал $Справочник]
   |    , sum(t.КолМатОсв) as КолМатОсв
   |    , sum(t.КолМатУтил) as КолМатУтил
   |From (
   |SELECT $Разделка.Сырье as Продукция
   |        , (Case When IsNULL(РазделкаСтроки.LineNo_,1) = 1 Then $Разделка.КоличествоСырья  Else 0 End) as КоличествоНоменклатуры
   |        , $РазделкаСтроки.Выход as Материал
   |        , $РазделкаСтроки.Количество as КолМатОсв
   |        , -$РазделкаСтроки.Количество as КолМатУтил
   |    FROM $Документ.Разделка AS Разделка With (NOLOCK)
   |        INNER JOIN _1SJOURN AS Журнал With (NOLOCK) ON Разделка.IDDOC = Журнал.IDDOC
   |        Left JOIN $ДокументСтроки.Разделка AS РазделкаСтроки With (NOLOCK) ON Разделка.IDDOC = РазделкаСтроки.IDDOC
   |    WHERE (Журнал.DATE_TIME_IDDOC between :ДатаНач and :ДатаКон~)
   |        AND ((Журнал.CLOSED & 1) = 1)
   |Union ALL
   |SELECT $Разделка.Сырье as Продукция
   |        , 0 as КоличествоНоменклатуры
   |        , НормыМатериалов.ЭлементМатериал as Материал
   |        , 0 as КолМатОсв
   |        , ($Разделка.КоличествоСырья * НормыМатериалов.Норма) as КолМатУтил
   |    FROM $Документ.Разделка AS Разделка With (NOLOCK)
   |        INNER JOIN _1SJOURN AS Журнал With (NOLOCK) ON Разделка.IDDOC = Журнал.IDDOC
   |        LEFT OUTER JOIN
   |        (SELECT НормыРасходов.PARENTEXT [Владелец]
   |                , $НормыРасходов.ВидЭлемента [ВидЭлемента]
   |                , $НормыРасходов.Элемент [ЭлементМатериал]
   |                , $ПоследнееЗначение.НормыРасходов.Норма(НормыРасходов.ID, :ДатаНач ) AS Норма
   |        FROM $Справочник.НормыРасходов AS НормыРасходов With (NOLOCK)
   |        WHERE ($ПоследнееЗначение.НормыРасходов.Норма(НормыРасходов.ID, :ДатаНач) <> 0)
   |                AND (НормыРасходов.ISMARK = 0) ) AS НормыМатериалов ON $ВидСправочника36.Номенклатура+НормыМатериалов.Владелец=$Разделка.Сырье
   |    WHERE (Журнал.DATE_TIME_IDDOC between :ДатаНач and :ДатаКон~)
   |        AND ((Журнал.CLOSED & 1) = 1)
   |  ) AS t
   |Where (t.Продукция=$ВидСправочника36.Номенклатура+:ВыбНоменклатура)
   |group by
   |    t.Продукция, t.КоличествоНоменклатуры, t.Материал
   |";
63 viktor_vv
 
23.11.11
12:32
|    , Sum(t.КоличествоНоменклатуры) as КоличествоНоменклатуры

и

|group by
   |    t.Продукция, t.Материал
64 yanejsh
 
23.11.11
12:32
(61)ааааа точно!!!!! каждая первая строка косячит!!!
блин, и чтоже делать?
65 yanejsh
 
23.11.11
12:34
(63) мне не надо суммировать КоличествоНоменклатуры
ты мне сам так советовал :) группировка таблицы
66 viktor_vv
 
23.11.11
12:37
Уже вижу, не получится. Там-то советовали без union.
67 viktor_vv
 
23.11.11
12:41
Во втором подзапросе вместо

0 as КоличествоНоменклатуры

(Case When IsNULL(РазделкаСтроки.LineNo_,1) = 1 Then $Разделка.КоличествоСырья  Else 0 End) as КоличествоНоменклатуры

и Group by как раньше.

Я какбы не совсем понял для чего union. Это типа ты хочешь факт и норму в одной таблице получить. А чего тогда норму не прилепить в первом запросе, и не делать union.
68 Ёпрст
 
23.11.11
12:42
(65) а как ты хочешь тогда ?
69 viktor_vv
 
23.11.11
12:42
(67)+ не, первая часть не поможет. Думай над второй.
70 viktor_vv
 
23.11.11
12:46
Вот эту хрень перекинь в первый запрос и не делай union.

LEFT OUTER JOIN
   |        (SELECT НормыРасходов.PARENTEXT [Владелец]
   |                , $НормыРасходов.ВидЭлемента [ВидЭлемента]
   |                , $НормыРасходов.Элемент [ЭлементМатериал]
   |                , $ПоследнееЗначение.НормыРасходов.Норма(НормыРасходов.ID, :ДатаНач ) AS Норма
   |        FROM $Справочник.НормыРасходов AS НормыРасходов With (NOLOCK)
   |        WHERE ($ПоследнееЗначение.НормыРасходов.Норма(НормыРасходов.ID, :ДатаНач) <> 0)
   |                AND (НормыРасходов.ISMARK = 0) ) AS НормыМатериалов

Только тут может придется full join если тебе нужны материалв, которые есть по норме, но нет по факту.
71 viktor_vv
 
23.11.11
12:54
Или если так нравиться, Вместо Case оставляй $Разделка.КоличествоСырья в обоих запросах, добавляй поле РазделкаСтроки.LineNo_

группируй, сверхк оберни еще раз Select и там уже

(Case When IsNULL(t.LineNo_,1) = 1 Then t.КоличествоСырья  Else 0 End) as КоличествоНоменклатуры
72 yanejsh
 
24.11.11
08:41
вот так вот вроде нормально получается:

Select
   tt.Продукция [Продукция $Справочник]
   , tt.Материал [Материал $Справочник]
   , tt.КолМатОсв as КолМатОсв
   , tt.КолМатУтил as КолМатУтил
   , (Case When IsNULL(РазделкаСтроки.LineNo_,0) = 1 Then $Разделка.КоличествоСырья  Else 0 End) as КоличествоНоменклатуры
From (
Select
       t.Продукция [Продукция]
       , t.Материал [Материал]
       , t.ДокР [ДокРазделка]
       , sum(t.КолМатОсв) as КолМатОсв
       , (Case When sum(t.КолМатУтил)<0 Then 0 Else sum(t.КолМатУтил) End) as КолМатУтил
   From (
   SELECT
           $Разделка.Сырье [Продукция]
           , $РазделкаСтроки.Выход as Материал
           , Разделка.IDDOC as ДокР
           , $РазделкаСтроки.Количество as КолМатОсв
           , -$РазделкаСтроки.Количество as КолМатУтил
       FROM $Документ.Разделка AS Разделка With (NOLOCK)
           INNER JOIN _1SJOURN AS Журнал With (NOLOCK) ON Разделка.IDDOC = Журнал.IDDOC
           Left JOIN $ДокументСтроки.Разделка AS РазделкаСтроки With (NOLOCK) ON Разделка.IDDOC = РазделкаСтроки.IDDOC
       WHERE (Журнал.DATE_TIME_IDDOC between :ДатаНач and :ДатаКон~)
           AND ((Журнал.CLOSED & 1) = 1)
   Union ALL
   SELECT $Разделка.Сырье as Продукция
           , НормыМатериалов.ЭлементМатериал as Материал
           , Разделка.IDDOC as ДокР
           , 0 as КолМатОсв
           , ($Разделка.КоличествоСырья * НормыМатериалов.Норма) as КолМатУтил
       FROM $Документ.Разделка AS Разделка With (NOLOCK)
           INNER JOIN _1SJOURN AS Журнал With (NOLOCK) ON Разделка.IDDOC = Журнал.IDDOC
           
           LEFT OUTER JOIN
           (SELECT НормыРасходов.PARENTEXT [Владелец]
                   , $НормыРасходов.ВидЭлемента [ВидЭлемента]
                   , $НормыРасходов.Элемент [ЭлементМатериал]
                   , $ПоследнееЗначение.НормыРасходов.Норма(НормыРасходов.ID, :ДатаНач ) AS Норма
           FROM $Справочник.НормыРасходов AS НормыРасходов With (NOLOCK)
           WHERE ($ПоследнееЗначение.НормыРасходов.Норма(НормыРасходов.ID, :ДатаНач) <> 0)
                   AND (НормыРасходов.ISMARK = 0) ) AS НормыМатериалов ON ($ВидСправочника36.Номенклатура+НормыМатериалов.Владелец=$Разделка.Сырье)
       WHERE (Журнал.DATE_TIME_IDDOC between :ДатаНач and :ДатаКон~)
           AND ((Журнал.CLOSED & 1) = 1)
     ) AS t
Where (t.Продукция=$ВидСправочника36.Номенклатура+:ВыбНоменклатура)
group by t.Продукция, t.Материал, t.ДокР ) AS tt
INNER JOIN $Документ.Разделка AS Разделка With (NOLOCK) ON Разделка.IDDOC = tt.ДокРазделка
Left JOIN $ДокументСтроки.Разделка AS РазделкаСтроки With (NOLOCK) ON (Разделка.IDDOC = РазделкаСтроки.IDDOC)AND($РазделкаСтроки.Выход=tt.Материал)
73 yanejsh
 
24.11.11
08:42
(52) а в чем там нелепость? что плохого с таком соединени?
74 Ёпрст
 
24.11.11
09:13
(73) да всё собственно нелепо.
У тебя к примеру, 2 одинаковых затраты в тч дока, в регистре их тоже 2, или больше - в запросе будет 4 с твоим соединением, а не 2.
Да и скрещивать строки документа с движениями регистра - моветон. Ибо как правило, движения регистра не пишутся один в один со строками документа.
75 yanejsh
 
24.11.11
09:47
ну я даже не знаю тогда, что и делать. Оставлю так чтоли.
Правда запрос стал выполняться намного дольше :(
может посоветуете, что почитать про запросы, чтобы понимать как надо писать? говорят, есть какие то планы запросов, про них я ничего не знаю
76 Ёпрст
 
24.11.11
09:52
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. Эдвард Йодан