powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Исправление некорректно введенных цен товара
6 сообщений из 6, страница 1 из 1
Исправление некорректно введенных цен товара
    #39694203
lisischko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте. Помогите, пожалуйста, найти решение следующей проблемы:
Нужно скриптом исправить цены следующим образом:
Если у одного товара есть цены/цена на 1000 процентов больше или меньше остальных, то исправить эту цену в таблице на среднее от оставшихся цен этого товара.

Пример:
архив цен товара:
1000
2000
3000
10000000
нам нужно исправить 10000000 на среднее от 1000, 2000, 3000

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
drop table #product
drop table #price

CREATE TABLE #product
(
    ProductID int NOT NULL,
    [Name] varchar(max) NOT NULL
);

CREATE TABLE #price
(
    PriceID int NOT NULL,
	Product int NOT NULL,
	[Value] decimal(12,2) NOT NULL
);

insert into #product (ProductID, [Name])
select 1, 'Товар 1'
union all
select 2, 'Товар 2'

insert into #price (PriceID, Product, [Value])
select 1, 1, 100.20
union all
select 2, 1, 110.20
union all
select 3, 1, 20000.20
union all
select 4, 2, 10.00
union all
select 5, 2, 20.00
union all
select 6, 2, 10000.20

--мои попытки найти решение
select *
	, max([Value]) over(partition by product) as MAX_
	, min([Value]) over(partition by product) as MIN_
	, round(100 / [value] * max([Value]) over(partition by product),0) as perc_max
	, round(100 / [value] * min([Value]) over(partition by product),0) as perc_min
	, sum([Value]) over(partition by product) - [Value] as SUM_
from #price
...
Рейтинг: 0 / 0
Исправление некорректно введенных цен товара
    #39694237
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lisischkoЕсли у одного товара есть цены/цена на 1000 процентов больше или меньше остальных, то исправить эту цену в таблице на среднее от оставшихся цен этого товара.а если будет, для одного и того же Product 2-а товара и "заниженный" и "завышенный", - они же "поломают" тебе всё "среднее от оставшихся цен этого товара" ...

вот такая ситуация имеется в виду
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
insert into #price (PriceID, Product, [Value])
select 1, 1, 100.20
union all
select 2, 1, 110.20
union all
select 3, 1, 20000.20
union all
select 4, 2, 10.00
union all
select 5, 2, 20.00
union all
select 6, 2, 10000.20
union all
select 7, 1, 0.20



если всё-таки, речь строго про один товар для каждого Product, то
завышенные
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
;with maxPrice as (
	select top 1 with ties * from #price order by row_number()over(partition by product order by [Value] desc)),
avgPrice as (
	select Product, avg([Value]) avgPrice, max([Value]) as maxPrice from #price where PriceID not in (select PriceID from maxPrice) group by Product)
	
update a
set a.Value=b.avgPrice  
from maxPrice a inner join avgPrice b on a.Product=b.Product 
where a.Value >= 11.0 * b.maxPrice 	


заниженные
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
;with minPrice as (
	select top 1 with ties * from #price order by row_number()over(partition by product order by [Value])),
avgPrice as (
	select Product, avg([Value]) avgPrice, min([Value]) as minPrice from #price where PriceID not in (select PriceID from minPrice) group by Product)
	
update a
set a.Value=b.avgPrice  
from minPrice a inner join avgPrice b on a.Product=b.Product 
where a.Value <=  b.minPrice / 11.0
...
Рейтинг: 0 / 0
Исправление некорректно введенных цен товара
    #39694262
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и, имха, разумнее отталкиваться от медианы, а не от какого-то х.п. "на 1000 процентов больше или меньше остальных "
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
;with cte as (
	select 
		*
		,mPrice	=PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY [Value]) over(partition by Product) 
	from #price),
cte1 as	(
	select 
		*
	from cte
	where Value >= mPrice * 11.0 or Value <= mPrice / 11.0),
cte2 as (
	select 
		Product
		,aPrice	=avg(Value)
	from cte
	where not(Value >= mPrice * 11.0 or Value <= mPrice / 11.0)
	group by Product)

update a
set a.Value = b.aPrice
from cte1 a inner join cte2 b on a.Product=b.Product 
...
Рейтинг: 0 / 0
Исправление некорректно введенных цен товара
    #39694318
lisischko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
court, спасибо!
Я прочитал про процентиль, ранее с ним не сталкивался, только не пойму зачем Вы далее делите и умножаете на 11.0?
Код: sql
1.
select * from cte where Value >= mPrice * 11.0 or Value <= mPrice / 11.0
...
Рейтинг: 0 / 0
Исправление некорректно введенных цен товара
    #39694321
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lisischkoтолько не пойму зачем Вы далее делите и умножаете на 11.0?это твои "на 1000 процентов больше или меньше"
"на 1000 процентов больше" - это в 11 раз больше, нуу и наоборот
...
Рейтинг: 0 / 0
Исправление некорректно введенных цен товара
    #39694665
lisischko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
court, :-) Спасибо!
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Исправление некорректно введенных цен товара
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]