Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
frz Member Откуда: Сообщений: 57 |
Есть 3 таблицы: Поставки(Код_наименования, Номер_задания, Группа_инженера, Наименование, Обозначение, Количество_плановое) Поставщики(Код_поставщика, Код_наименования, Поставщик, Город) Приход(Код_счета, Код_поставщика, Количество, Цена_фактическая) мне нужно получить таблицу(из нее потом будет просходить экспорт в эксель), к примеру update_501(Группа_инженера, Наименование, Обозначение, Количество), которая будет содержать уникальные обозначения по группе инженера 501, а в поле Количество сумма из значений поля Количество таблицы Приход по каждому обозначению. Сначала формирую ее так Insert dbo.update_501(Наименование, Обозначение, Группа_инженера) select Наименование ,Обозначение, Группа_инженера from Поставки where (I.Группа_инженера = 501) group by Наименование ,Обозначение, Группа_инженера у меня возникла проблема с триггером, который должен добавлять в update_501 записи с "Обозначение", которых еще там нет. ALTER trigger [update_pki_501] ON [dbo].[Поставки] After Insert as begin Set nocount on; if (not(exists(select * from [INSERTED]))) return; Insert dbo.update_501(Наименование, Обозначение, Группа_инженера) select I.Наименование ,I.Обозначение ,I.Группа_инженера from Inserted I where (I.Группа_инженера = 501) and (update_501.Обозначение <> I.Обозначение) end Эта конструкция (update_501.Обозначение <> I.Обозначение)не годится. Подскажите как правильно? И хотя бы идею, как сделать чтобы в поле Количество накапливалась сумма для данного Обозначения? |
22 авг 12, 14:45 [13049569] Ответить | Цитировать Сообщить модератору |
aleks2
Guest |
Версию сервера не огласили, а то merge было бы уместнее...ALTER trigger [update_pki_501] ON [dbo].[Поставки] After Insert as begin Set nocount on; if (not(exists(select * from [INSERTED]))) return; Insert dbo.update_501(Наименование, Обозначение, Группа_инженера) select I.Наименование ,I.Обозначение ,I.Группа_инженера from Inserted I where (I.Группа_инженера = 501) and not exists(select * from dbo.update_501 x where x.Группа_инженера=I.Группа_инженера and x.Обозначение = I.Обозначение) end |
22 авг 12, 14:57 [13049674] Ответить | Цитировать Сообщить модератору |
trew Member Откуда: Москва Сообщений: 2646 |
этот код не нуженif (not(exists(select * from [INSERTED]))) return; триггер срабатывает, когда что-то добавляется. Поэтому в INSERTED всегда есть записи. |
22 авг 12, 15:04 [13049740] Ответить | Цитировать Сообщить модератору |
aleks2
Guest |
Наивный. |
||
22 авг 12, 15:09 [13049777] Ответить | Цитировать Сообщить модератору |
iap Member Откуда: Москва Сообщений: 47047 |
![]() А если так: INSERT T(F) SELECT NULL WHERE 2*2=5;? Тоже есть записи? Вот зачем там скобок накручено мама не горюй? Это действительно непонятно. |
||
22 авг 12, 15:11 [13049806] Ответить | Цитировать Сообщить модератору |
invm Member Откуда: Москва Сообщений: 9633 |
|
||
22 авг 12, 16:11 [13050362] Ответить | Цитировать Сообщить модератору |
frz Member Откуда: Сообщений: 57 |
aleks2, спасибо. Со скобочками действительно было взято оттуда. А как мне сумму посчитать, реально ли это вообще в том виде, в котором я запланировал? |
23 авг 12, 08:43 [13053009] Ответить | Цитировать Сообщить модератору |
aleks2
Guest |
Все можна. Единственно непонятно: нафега тебе считать именно а триггере и, ваще, нафега здесь триггер? |
||
23 авг 12, 08:46 [13053015] Ответить | Цитировать Сообщить модератору |
qwerty112
Guest |
маи грабли :) если у вас на самом деле так - "в INSERTED всегда есть записи" - это баг не патченного сервера посмотрите эту тему AFTER INSERT UPDATE(COUNT SERVICES) |
||
23 авг 12, 08:55 [13053039] Ответить | Цитировать Сообщить модератору |
frz Member Откуда: Сообщений: 57 |
aleks2, это все для выгрузки в эксель, поля спецификация(аналогичное) и приход будут заполняться спустя какое-то время после выгрузки остальных полей(их больше чем в таблице апдейт_501). Я и подумал, что может накапливать их а потом после выгрузки в эксель устанавливать null, а в экселе уже будет макрос который будет раскидывать нужные значения в спецификации и прихода по обозначениям. Может я не прав. qwerty, тему смотрел, но у меня возникли проблемы со связыванием таблиц, как не сделаю, либо не туда добавляется либо ошибки |
23 авг 12, 09:17 [13053110] Ответить | Цитировать Сообщить модератору |
aleks2
Guest |
Ты не прав. |
||
23 авг 12, 10:13 [13053313] Ответить | Цитировать Сообщить модератору |
frz Member Откуда: Сообщений: 57 |
А как тогда можно осуществить, то что я написал? |
||
23 авг 12, 10:41 [13053493] Ответить | Цитировать Сообщить модератору |
aleks2
Guest |
Прямой расчет во View, если очень много данных Indexed View. |
||||
23 авг 12, 10:54 [13053591] Ответить | Цитировать Сообщить модератору |
frz Member Откуда: Сообщений: 57 |
А чем плох вариант с триггером? Опыта у меня немного, поэтому не очень представляю каким образом это осуществить с view. С триггером мне хотя бы понятно, что в таблицу для выгрузки выбираются добавленные значения. |
||
23 авг 12, 11:13 [13053767] Ответить | Цитировать Сообщить модератору |
aleks2
Guest |
Что произойдет с данными, которые будут вставлены между моментом выгрузки в эксель и моментом очистки таблицы? |
||||
23 авг 12, 11:18 [13053819] Ответить | Цитировать Сообщить модератору |
frz Member Откуда: Сообщений: 57 |
Наверное что-то нехорошее, если вы сакцентировали внимание на этом моменте) Я видимо задаю неверные вопросы, но это связано с тем, что не имею достаточно опыта чтобы оценить. |
||
23 авг 12, 12:09 [13054362] Ответить | Цитировать Сообщить модератору |
frz Member Откуда: Сообщений: 57 |
aleks2, можешь подсказать как формировать представление по тем условиям, которые я написал? понимаю, тут приветствуется постинг сперва своих наработок, но у меня совершенно нет идей. |
23 авг 12, 14:10 [13055476] Ответить | Цитировать Сообщить модератору |
aleks2
Guest |
create view dbo.MyUpdate with schemabinding as select Наименование ,Обозначение, Группа_инженера, SUM( Количество ) as [Количество сумма ], COUNT_BIG(*) as Cnt from Поставки group by Наименование ,Обозначение, Группа_инженера go create unique clustered index IX_MyUpdate on dbo.MyUpdate (Наименование ,Обозначение, Группа_инженера); go -- данные для "экспорта в эксель" -- если прочие Группа_инженера <> 501 не нужны - фильтр можно перенестьи в определение view select * from dbo.MyUpdate with(noexpand) where Группа_инженера = 501 |
23 авг 12, 14:23 [13055567] Ответить | Цитировать Сообщить модератору |
frz Member Откуда: Сообщений: 57 |
aleks2, спасибо! |
23 авг 12, 14:42 [13055680] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |