Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
Laikon Member Откуда: Сообщений: 24 |
Всем доброго времени суток! Помогите, плиз, разобраться в проблеме с одним запросом. Есть две таблицы:
И есть запрос формата: update [таблица "партия"] set [кол-во товара в блоке] = (sum([кол-во_товара]) from [таблица "партия-и-упаковка"] where [статус упаковки]="блок") Проблема в том что я не могу понять как поставить условие, чтобы суммировалось количество товара для каждой партии отдельно, так как во 2 таблице есть множество записей с одной и той же партией, но номер упаковки отличается и у каждой упаковки свой статус. |
||||||||||||||
21 июн 19, 13:25 [21912911] Ответить | Цитировать Сообщить модератору |
Laikon Member Откуда: Сообщений: 24 |
Для примера накидал данные для таблиц:
Т.е. запрос должен в таблице "Партия" для партии 1 обновить значение "кол-во товара в блоке" = 27, для партии 2 = 123, для партии 3 = 107 |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
21 июн 19, 13:39 [21912928] Ответить | Цитировать Сообщить модератору |
BredSpit Member Откуда: Сообщений: 22 |
Соединиться по партиям и условию 'блокировано' и посчитать суммы |
21 июн 19, 15:23 [21913065] Ответить | Цитировать Сообщить модератору |
PizzaPizza Member Откуда: Сообщений: 417 |
google: update join |
21 июн 19, 18:06 [21913166] Ответить | Цитировать Сообщить модератору |
Laikon Member Откуда: Сообщений: 24 |
BredSpit, это и так понятно, а поконкретнее? Как написать подзапрос для таблицы "партия-и-упаковка", чтобы он не греб все стрки подряд? Потому что если поставить условие после него и в основном апдейте ставить where [партия.партия]=[партия-и-упаковка.партия] and [партия-и-упаковка.статус]='блок' т он сначала просуммирует все количество, а потом только будет обновлять таблицу [партия]. А мне нужно чтобы он суммировал каждую партию отдельно |
22 июн 19, 05:58 [21913273] Ответить | Цитировать Сообщить модератору |
982183 Member Откуда: VL Сообщений: 3374 |
Всё зависит от того, в разрезе чего у тебя коды уникальны. Скорее всего надо добавить условия партия.серийный номер = Партия-и-упаковка.серийный номер и партия.партия = Партия-и-упаковка.партия Хотя странно, почему в "Партия-и-упаковка" нет "код товара" |
22 июн 19, 07:16 [21913275] Ответить | Цитировать Сообщить модератору |
982183 Member Откуда: VL Сообщений: 3374 |
Есть разница между. "Проставить для всех партий сумму кол-ва из таблицы "партия-и упаковка" с со статусом упаковки =блок" и "Проставить для всех партий сумму кол-ва СООТВЕТСТВУЮЩИХ товаров из таблицы "партия-и упаковка" с со статусом упаковки =блок" |
22 июн 19, 08:43 [21913282] Ответить | Цитировать Сообщить модератору |
Laikon Member Откуда: Сообщений: 24 |
982183, Код товара в таблице есть, но у одного товара множество партий, а вот партия всегда уникальна (даже у разных товаров не может быть одинаковых партий) поэтому привязку надо сделать через партию |
22 июн 19, 09:03 [21913284] Ответить | Цитировать Сообщить модератору |
Laikon Member Откуда: Сообщений: 24 |
PizzaPizza, насчет использования join вместо подзапроса была идея, но у меня не получается корректно составить эту конструкцию(((( В join я пока не очень силен. Привык работать подзапросами |
22 июн 19, 09:05 [21913285] Ответить | Цитировать Сообщить модератору |
982183 Member Откуда: VL Сообщений: 3374 |
Есть партия товаров (Когда один код партии может принадлежать нескольким товарам) Есть партия товара (Когда партия товара уникальна в разрезе номенклатуры) Есть уникальная партия. (Когда именно код партии идентифицирует товар)
Значит тебе надо добавить условие партия.партия = Партия-и-упаковка.партия потом научишься через join |
||||
22 июн 19, 11:47 [21913309] Ответить | Цитировать Сообщить модератору |
PizzaPizza Member Откуда: Сообщений: 417 |
Laikon, без join в sqlе практически делать нечего - это один из смыслов реляционных баз create table #t ( pa int, qua int ); insert into #t (pa,qua) values (1,0), (2,0), (3,0); with pack as ( select * from (VALUES(1,27,1),(2,58,0),(2,58,1),(2,65,1),(3,45,0),(3,31,1),(2,76,0),(3,76,1)) AS b(pa,qua,st) ) -- обновить таблицу установив значение... UPDATE #t SET qua = s -- на основе другой... таблицы FROM (SELECT p.pa, sum(pack.qua) as s FROM #t as p join pack ON p.pa = pack.pa AND st = 1 GROUP BY p.pa) as a -- при условии WHERE #t.pa = a.pa SELECT * from #t |
22 июн 19, 20:38 [21913435] Ответить | Цитировать Сообщить модератору |
982183 Member Откуда: VL Сообщений: 3374 |
Всё правильно, но человек в данном случае структуру update не понимает. Не видит, что для обновления надо должным образом сформировать/подготовить данные для обновления. Что надо и сгруппировать и суммировать и сравнить. А вложенный запрос он не поймет. http://sqlfiddle.com/#!18/9ed02/3 CREATE TABLE Part ([pa] int, [qua] int); insert into Part (pa,qua) values (1,0), (2,0), (3,0); CREATE TABLE PartU ([pa] int,[qua] int, [st] int); insert into PartU (pa,qua,st) values (1,27,1),(2,58,0),(2,58,1),(2,65,1),(3,45,0),(3,31,1),(2,76,0),(3,76,1); SELECT PartU.pa, sum(PartU.qua) as s into bufer FROM PartU WHERE PartU.st = 1 GROUP BY PartU.pa; UPDATE Part set Part.qua = bufer.s FROM Part INNER JOIN bufer ON (Part.pa = bufer.pa); select * from Part |
23 июн 19, 07:23 [21913504] Ответить | Цитировать Сообщить модератору |
Laikon Member Откуда: Сообщений: 24 |
982183, PizzaPizza, т.е. я правильно понимаю, что просто с наскока обновить данные нереально и необходимо создать виртуальную таблицу, где произвести все расчеты и потом обновиться из этой виртуально таблицы? Бин, печально....Я данные в таблицах просто для примера вам привел, а по факту в каждой таблице записей больше тысячи и перечислять все в новую таблицу капец как не хочется.......Что касается вложенного запроса - я вот как раз пытался сделать что-то подобное при приравнивании, но вот не смог догадаться как связать условие по партии из мелкого запроса с основным...Ладно, но мыслю для переваривания вы мне подкинули! Большое спасибо!! |
24 июн 19, 07:10 [21913788] Ответить | Цитировать Сообщить модератору |
Laikon Member Откуда: Сообщений: 24 |
982183, PizzaPizza, мне еще подкидывали идею касательно пошагового апдейта, т.е. с использованием курсора. Как ваше мнение - есть ли смысл копать в эту сторону? |
24 июн 19, 07:12 [21913789] Ответить | Цитировать Сообщить модератору |
982183 Member Откуда: VL Сообщений: 3374 |
PizzaPizza дал вам конечное, полностью работоспособное решение. Я попытался пошагово объяснить логику и синтаксис. Посмотрите учебные примеры по UPDATE там всё разжевано. |
24 июн 19, 07:23 [21913791] Ответить | Цитировать Сообщить модератору |
982183 Member Откуда: VL Сообщений: 3374 |
У тебя же в условии сказано " основании параметров другой таблицы" скорее всего "основании ДАННЫХ другой таблицы" в таблице у тебя нужных данных НЕТ. Их надо предварительно сформировать (агрегировать)
Сколько лишних миллисекунд будет выполняться запрос? |
||||
24 июн 19, 08:15 [21913795] Ответить | Цитировать Сообщить модератору |
Laikon Member Откуда: Сообщений: 24 |
982183, понял, спасибо! буду разбираться |
24 июн 19, 09:21 [21913823] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |