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

Откуда:
Сообщений: 2220
Здравствуйте!

Есть исходная таблица
Код ТТ Общее SKU SKU Кол SKU в Общем SKU Процент возврата
ТТ569 SKU1/SKU2 SKU1 2 0.3
ТТ569 SKU1/SKU2 SKU2 2 0.2
ТТ569 SKU3/SKU4 SKU3 2 0
ТТ569 SKU3/SKU4 SKU4 2 0.23
ТТ569 SKU5 SKU5 1 0.2
ТТ569 SKU6/SKU7 SKU6 2 0
ТТ569 SKU6/SKU7 SKU7 2 0
ТТ569 SKU10/SK11 SKU10 2 0.42
ТТ569 SKU10/SK11 SKU11 2 0.42

Тут логика такая, что у общего SKU может быть один или больше SKU.

Нужен такой результат
Код ТТ Общее SKU SKU Кол SKU в Общем SKU Процент возврата Результат
ТТ569 SKU1/SKU2 SKU1 2 0.3
ТТ569 SKU1/SKU2 SKU2 2 0.2 Да
ТТ569 SKU3/SKU4 SKU3 2 0 Да
ТТ569 SKU3/SKU4 SKU4 2 0.23
ТТ569 SKU5 SKU5 1 0.2
ТТ569 SKU6/SKU7 SKU6 2 0
ТТ569 SKU6/SKU7 SKU7 2 0 Да
ТТ569 SKU10/SK11 SKU10 2 0.42
ТТ569 SKU10/SK11 SKU11 2 0.42 Да

То есть для каждого общего SKU, где количество SKU в Общем SKU больше 1, нужно отметить то SKU c наименьшим процентом возврата.

Для решения такой задачи написал такой SQL-запрос
+
SELECT
	Т1.`Код ТТ`,
	Т1.`Общее SKU`,
	Т1.`SKU`,
	Т1.`Кол SKU в Общем SKU`,
	Т1.`Процент возврата`,
	Т2.`Минимальный процент возврата`,	
	IIF (Т1.`Кол SKU в Общем SKU` > 1 AND Т1.`Процент возврата` = Т2.`Минимальный процент возврата` , 'Да', ) AS `Результат`
FROM
        Таблица1 AS Т1
LEFT JOIN
	(SELECT
		Тв1.`Код ТТ`,
		Тв1.`Общее SKU`,		
		MIN(Тв1.`Процент возврата`)	AS `Минимальный процент возврата`
	FROM
		Таблица1 AS Тв1
	GROUP BY
		Тв1.`Код ТТ`,
		Тв1.`Общее SKU`) AS Т2		
ON
	Т1.`Код ТТ` = Т2.`Код ТТ`
	AND
	Т1.`Общее SKU` = Т2.`Общее SKU`

И получается такой результат

Код ТТ Общее SKU SKU Кол SKU в Общем SKU Процент возврата Минимальный процент возврата Результат
ТТ569 SKU1/SKU2 SKU1 2 0.3 0.3
ТТ569 SKU1/SKU2 SKU2 2 0.2 0.2 Да
ТТ569 SKU3/SKU4 SKU3 2 0 0 Да
ТТ569 SKU3/SKU4 SKU4 2 0.23 0.23
ТТ569 SKU5 SKU5 1 0.20.2
ТТ569 SKU6/SKU7 SKU6 2 0 0 Да
ТТ569 SKU6/SKU7 SKU7 2 0 0 Да
ТТ569 SKU10/SK11 SKU10 2 0.42 0.42 Да
ТТ569 SKU10/SK11 SKU11 2 0.42 0.42 Да


Но тут не учитывается, если в одном общем SKU, например, "SKU10/SKU11" проценты возврата одинаковые. Если одинаковые, то указывает "Да", кроме первой строки внутри Общего SKU.

Подскажите, как в SQL это учесть? Есть то, что еще не учел?
16 дек 16, 14:10    [20012044]     Ответить | Цитировать Сообщить модератору
 Re: Учесть одинаковые значения  [new]
invm
Member

Откуда: Москва
Сообщений: 9827
ferzmikk
Подскажите, как в SQL это учесть?
select
 *,
 case
  when count(*) over (partition by [Общее SKU]) > 1 and min([Процент возврата]) over (partition by [Общее SKU]) = [Процент возврата] and row_number() over (partition by [Общее SKU] order by ([SKU]) > 1 then 'Да'
  else ''
 end
from
 dbo.Таблица;
ferzmikk
Есть то, что еще не учел?
Ваш запрос напписан для MySQL, а за помощью вы пришли на форум по MSSQL
16 дек 16, 14:29    [20012194]     Ответить | Цитировать Сообщить модератору
 Re: Учесть одинаковые значения  [new]
Sybex
Member

Откуда: Moscow
Сообщений: 119
ferzmikk
Есть то, что еще не учел?

Сортировка! По какому критерию сортировать ваши строки, чтобы определить для какой из них нужно проставить "Да", в случае одинаковых значений? Потому что если вам попадутся "SKU9/SKU10" и вы попытаетесь их отсортировать по столбцу SKU, то угадайте в каком порядке они пойдут?
16 дек 16, 14:42    [20012338]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить