Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Выборочное обновление данных обной таблицы на основании параметров другой таблицы  [new]
Laikon
Member

Откуда:
Сообщений: 24
Всем доброго времени суток!
Помогите, плиз, разобраться в проблеме с одним запросом. Есть две таблицы:
Партия
серийный номер
код товара
партия
кол-во товара в блоке
кол-во товара доступного

Партия-и-упаковка
серийный номер
партия
номер упаковки
кол-во товара
статус упаковки

И есть запрос формата:
update [таблица "партия"] set [кол-во товара в блоке] = (sum([кол-во_товара]) from [таблица "партия-и-упаковка"] where [статус упаковки]="блок")

Проблема в том что я не могу понять как поставить условие, чтобы суммировалось количество товара для каждой партии отдельно, так как во 2 таблице есть множество записей с одной и той же партией, но номер упаковки отличается и у каждой упаковки свой статус.
21 июн 19, 13:25    [21912911]     Ответить | Цитировать Сообщить модератору
 Re: Выборочное обновление данных обной таблицы на основании параметров другой таблицы  [new]
Laikon
Member

Откуда:
Сообщений: 24
Для примера накидал данные для таблиц:
Партия
серийный номер код товара партия кол-во товара в блоке кол-во товара доступного
1 67983 партия 1 0 0
2 67983 партия 2 0 0
3 67983 партия 3 0 0


Партия-и-упаковка
серийный номер партия номер упаковки кол-во товара статус упаковки
1 партия 1 43 27 блок
2 партия 2 67 58 норм
3 партия 2 87 58 блок
4 партия 2 34 65 блок
5 партия 3 23 45 норм
6 партия 3 81 31 блок
7 партия 2 15 76 норм
8 партия 3 70 76 блок


Т.е. запрос должен в таблице "Партия" для партии 1 обновить значение "кол-во товара в блоке" = 27, для партии 2 = 123, для партии 3 = 107
21 июн 19, 13:39    [21912928]     Ответить | Цитировать Сообщить модератору
 Re: Выборочное обновление данных обной таблицы на основании параметров другой таблицы  [new]
BredSpit
Member

Откуда:
Сообщений: 19
Соединиться по партиям и условию 'блокировано' и посчитать суммы
21 июн 19, 15:23    [21913065]     Ответить | Цитировать Сообщить модератору
 Re: Выборочное обновление данных обной таблицы на основании параметров другой таблицы  [new]
PizzaPizza
Member

Откуда:
Сообщений: 309
google: update join
21 июн 19, 18:06    [21913166]     Ответить | Цитировать Сообщить модератору
 Re: Выборочное обновление данных обной таблицы на основании параметров другой таблицы  [new]
Laikon
Member

Откуда:
Сообщений: 24
BredSpit, это и так понятно, а поконкретнее? Как написать подзапрос для таблицы "партия-и-упаковка", чтобы он не греб все стрки подряд? Потому что если поставить условие после него и в основном апдейте ставить
where [партия.партия]=[партия-и-упаковка.партия] and [партия-и-упаковка.статус]='блок'

т он сначала просуммирует все количество, а потом только будет обновлять таблицу [партия]. А мне нужно чтобы он суммировал каждую партию отдельно
22 июн 19, 05:58    [21913273]     Ответить | Цитировать Сообщить модератору
 Re: Выборочное обновление данных обной таблицы на основании параметров другой таблицы  [new]
982183
Member

Откуда: VL
Сообщений: 3349
Всё зависит от того, в разрезе чего у тебя коды уникальны.
Скорее всего надо добавить условия

партия.серийный номер = Партия-и-упаковка.серийный номер
и
партия.партия = Партия-и-упаковка.партия

Хотя странно, почему в "Партия-и-упаковка" нет "код товара"
22 июн 19, 07:16    [21913275]     Ответить | Цитировать Сообщить модератору
 Re: Выборочное обновление данных обной таблицы на основании параметров другой таблицы  [new]
982183
Member

Откуда: VL
Сообщений: 3349
Есть разница между.
"Проставить для всех партий сумму кол-ва из таблицы "партия-и упаковка" с со статусом упаковки =блок"
и
"Проставить для всех партий сумму кол-ва СООТВЕТСТВУЮЩИХ товаров из таблицы "партия-и упаковка" с со статусом упаковки =блок"
22 июн 19, 08:43    [21913282]     Ответить | Цитировать Сообщить модератору
 Re: Выборочное обновление данных обной таблицы на основании параметров другой таблицы  [new]
Laikon
Member

Откуда:
Сообщений: 24
982183, Код товара в таблице есть, но у одного товара множество партий, а вот партия всегда уникальна (даже у разных товаров не может быть одинаковых партий) поэтому привязку надо сделать через партию
22 июн 19, 09:03    [21913284]     Ответить | Цитировать Сообщить модератору
 Re: Выборочное обновление данных обной таблицы на основании параметров другой таблицы  [new]
Laikon
Member

Откуда:
Сообщений: 24
PizzaPizza, насчет использования join вместо подзапроса была идея, но у меня не получается корректно составить эту конструкцию(((( В join я пока не очень силен. Привык работать подзапросами
22 июн 19, 09:05    [21913285]     Ответить | Цитировать Сообщить модератору
 Re: Выборочное обновление данных обной таблицы на основании параметров другой таблицы  [new]
982183
Member

Откуда: VL
Сообщений: 3349
Laikon
982183, Код товара в таблице есть, но у одного товара множество партий, а вот партия всегда уникальна (даже у разных товаров не может быть одинаковых партий)

Есть партия товаров (Когда один код партии может принадлежать нескольким товарам)
Есть партия товара (Когда партия товара уникальна в разрезе номенклатуры)
Есть уникальная партия. (Когда именно код партии идентифицирует товар)

Laikon
поэтому привязку надо сделать через партию

Значит тебе надо добавить условие партия.партия = Партия-и-упаковка.партия
потом научишься через join
22 июн 19, 11:47    [21913309]     Ответить | Цитировать Сообщить модератору
 Re: Выборочное обновление данных обной таблицы на основании параметров другой таблицы  [new]
PizzaPizza
Member

Откуда:
Сообщений: 309
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]     Ответить | Цитировать Сообщить модератору
 Re: Выборочное обновление данных обной таблицы на основании параметров другой таблицы  [new]
982183
Member

Откуда: VL
Сообщений: 3349
Всё правильно, но человек в данном случае структуру 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]     Ответить | Цитировать Сообщить модератору
 Re: Выборочное обновление данных обной таблицы на основании параметров другой таблицы  [new]
Laikon
Member

Откуда:
Сообщений: 24
982183, PizzaPizza, т.е. я правильно понимаю, что просто с наскока обновить данные нереально и необходимо создать виртуальную таблицу, где произвести все расчеты и потом обновиться из этой виртуально таблицы? Бин, печально....Я данные в таблицах просто для примера вам привел, а по факту в каждой таблице записей больше тысячи и перечислять все в новую таблицу капец как не хочется.......Что касается вложенного запроса - я вот как раз пытался сделать что-то подобное при приравнивании, но вот не смог догадаться как связать условие по партии из мелкого запроса с основным...Ладно, но мыслю для переваривания вы мне подкинули! Большое спасибо!!
24 июн 19, 07:10    [21913788]     Ответить | Цитировать Сообщить модератору
 Re: Выборочное обновление данных обной таблицы на основании параметров другой таблицы  [new]
Laikon
Member

Откуда:
Сообщений: 24
982183, PizzaPizza, мне еще подкидывали идею касательно пошагового апдейта, т.е. с использованием курсора. Как ваше мнение - есть ли смысл копать в эту сторону?
24 июн 19, 07:12    [21913789]     Ответить | Цитировать Сообщить модератору
 Re: Выборочное обновление данных обной таблицы на основании параметров другой таблицы  [new]
982183
Member

Откуда: VL
Сообщений: 3349
PizzaPizza дал вам конечное, полностью работоспособное решение.
Я попытался пошагово объяснить логику и синтаксис.
Посмотрите учебные примеры по UPDATE там всё разжевано.
24 июн 19, 07:23    [21913791]     Ответить | Цитировать Сообщить модератору
 Re: Выборочное обновление данных обной таблицы на основании параметров другой таблицы  [new]
982183
Member

Откуда: VL
Сообщений: 3349
Laikon
необходимо создать виртуальную таблицу, где произвести все расчеты и потом обновиться из этой виртуально таблицы?

У тебя же в условии сказано " основании параметров другой таблицы" скорее всего "основании ДАННЫХ другой таблицы"
в таблице у тебя нужных данных НЕТ. Их надо предварительно сформировать (агрегировать)

Laikon
а по факту в каждой таблице записей больше тысячи и перечислять все в новую таблицу капец как не хочется.......

Сколько лишних миллисекунд будет выполняться запрос?
24 июн 19, 08:15    [21913795]     Ответить | Цитировать Сообщить модератору
 Re: Выборочное обновление данных обной таблицы на основании параметров другой таблицы  [new]
Laikon
Member

Откуда:
Сообщений: 24
982183, понял, спасибо! буду разбираться
24 июн 19, 09:21    [21913823]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить