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