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