SQL находит среднее значение n строк, где n - сумма полей - PullRequest
0 голосов
/ 28 июня 2011

У меня есть данные, которые выглядят следующим образом.

SoldToRetailer

OrderDate  | Customer  | Product  | price | units
-------------------------------------------------
1-jun-2011 | customer1 | Product1 | $10   | 5
2-jun-2011 | customer1 | Product1 | $5    | 3
3-jun-2011 | customer1 | Product2 | $10   | 4
4-jun-2011 | customer1 | Product1 | $4    | 4
5-jun-2011 | customer2 | Product3 | $10   | 1

SalesByRetailers

Customer  | Product  | units
-----------------------------
customer1 | Product1 | 5
customer2 | Product3 | 1

Вот что мне нужно.

Продажи (средняя цена)

Customer  | Product  | units | Average Price
--------------------------------------------
customer1 | Product1 | 5     | $3.44
customer2 | Product3 | 1     | $10

Средняя цена определяется как средняя цена последних цен SoldToRetailer, которые складываются в единицу.

Итак, в первом случае я получаю заказы с 4 по 2 июня. Я не нуждаюсь (на самом деле хочу), чтобы заказы с 1 июня были включены.

РЕДАКТИРОВАТЬ: Надеюсь, лучшее объяснение.

Я пытаюсь определить правильную (самую последнюю) цену, по которой товар был продан продавцу. Это LIFO заказ по ценам. Цена определяется путем усреднения цены, проданной за последние n заказов. Где n = общий объем розничных продаж для конкретного продукта и клиента.

В псевдокоде SQL это будет выглядеть следующим образом.

Select s1.Customer, s1.product, average(s2.price)
from SalesByRetailers s1
join SoldToRetailer s2
on s1.customer=s2.customer
and s1.product=s2.product
and ( select top (count of records where s2.units = s1.units) from s2 order by OrderDate desc)

Мне нужно вернуть количество записей из SoldToRetailer, где сумма единиц равна> = SalesByRetailer Units.

Похоже, что это может быть решено с помощью RANK или перегородки, но я в растерянности.

Таблица SoldToRetailer огромна, поэтому производительность на высоте.

Запуск на SQL 2008R2 Спасибо за помощь

Ответы [ 2 ]

1 голос
/ 29 мая 2012

Итак, я использовал 3 техники.Сначала я создал таблицу с предложением over by, чтобы получить отсортированный список продуктов и цен, а затем отредактировал таблицу, добавив в нее скользящее среднее.Подвыбор OUTER APPLY устранил мою последнюю проблему.Надеемся, что этот код поможет кому-то еще с подобной проблемой.

Привет Джеффу Модену из SQLSderverCentral.com, известному как справочник по скользящей средней.

0 голосов
/ 29 июня 2011
declare @table table (customer varchar(15), product varchar(15), qty int, price decimal(6,2))

insert into @table (customer, product, qty, price)
values
('customer1', 'product1', 5, 3),
('customer1', 'product1', 4, 4),
('customer1', 'product1', 3, 2),
('customer1', 'product1', 2, 13),
('customer1', 'product1', 3, 3),

('customer1', 'product2', 5, 1),
('customer1', 'product2', 4, 7),
('customer1', 'product2', 2, 5),
('customer1', 'product2', 6, 23),
('customer1', 'product2', 2, 1),

('customer2', 'product1', 2, 1),
('customer2', 'product1', 4, 4),
('customer2', 'product1', 7, 3),
('customer2', 'product1', 1, 12),
('customer2', 'product1', 2, 3),

('customer2', 'product2', 3, 2),
('customer2', 'product2', 6, 5),
('customer2', 'product2', 8, 4),
('customer2', 'product2', 2, 11),
('customer2', 'product2', 1, 2)

select customer, product, sum(qty) as units, (sum(qty * price))/SUM(qty) as 'Average Price' from @table 
group by customer, product
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...