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

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

Есть такая задача. Нужно написать такой SQL-запрос, который случайно отбирает строки по определенным условиям. Виды отбора
1. Случайно отбирает ТТ по заданному проценту
2. Случайно отбирает ТТ по заданному проценту, так чтобы для каждого клиента пропорционально отбирались ТТ (у одного клиента могут больше одной ТТ).
3. Случайно отбирает ТТ по заданному количеству (не важно какой клиент)

Отбираются таким образом, что для каждого ТТ выгружаются все SKU и Дата.

Есть константа, который задает вид отбора.

Написал SQL-запрос, пока для третьего вида отбора. Но что то не получается. Как правильно дописать? Ошибка не из за Order By?

+SQL-запрос
DECLARE @Таблица table(	
	[Клиент] varchar(8),
	[Код юр лица] varchar(12),
	[Код ТТ] varchar(8),	
	[Код продукции] varchar(8),
	[Дата] date,
	[Отгрузки штук] integer	
	)	
;

INSERT INTO
  @Таблица
VALUES 
('Клиент1', 'Код юр лица1', 'Код ТТ1','SKU1', '01.01.2014', 100),
('Клиент1', 'Код юр лица1', 'Код ТТ1','SKU1', '02.01.2014', 100),
('Клиент1', 'Код юр лица1', 'Код ТТ1','SKU1', '03.01.2014', 100),
('Клиент1', 'Код юр лица1', 'Код ТТ1','SKU2', '01.01.2014', 100),
('Клиент1', 'Код юр лица1', 'Код ТТ1','SKU2', '02.01.2014', 100),
('Клиент1', 'Код юр лица1', 'Код ТТ1','SKU2', '03.01.2014', 100),
('Клиент1', 'Код юр лица1', 'Код ТТ2','SKU1', '01.01.2014', 100),
('Клиент1', 'Код юр лица1', 'Код ТТ2','SKU1', '02.01.2014', 100),
('Клиент1', 'Код юр лица1', 'Код ТТ2','SKU1', '03.01.2014', 100),
('Клиент1', 'Код юр лица1', 'Код ТТ2','SKU2', '01.01.2014', 100),
('Клиент1', 'Код юр лица1', 'Код ТТ2','SKU2', '02.01.2014', 100),
('Клиент1', 'Код юр лица1', 'Код ТТ2','SKU2', '03.01.2014', 100),
('Клиент2', 'Код юр лица2', 'Код ТТ1','SKU1', '01.01.2014', 100),
('Клиент2', 'Код юр лица2', 'Код ТТ1','SKU1', '02.01.2014', 100),
('Клиент2', 'Код юр лица2', 'Код ТТ1','SKU1', '03.01.2014', 100),
('Клиент2', 'Код юр лица2', 'Код ТТ1','SKU2', '01.01.2014', 100),
('Клиент2', 'Код юр лица2', 'Код ТТ1','SKU2', '02.01.2014', 100),
('Клиент2', 'Код юр лица2', 'Код ТТ1','SKU2', '03.01.2014', 100),
('Клиент2', 'Код юр лица2', 'Код ТТ2','SKU1', '01.01.2014', 100),
('Клиент2', 'Код юр лица2', 'Код ТТ2','SKU1', '02.01.2014', 100),
('Клиент2', 'Код юр лица2', 'Код ТТ2','SKU1', '03.01.2014', 100),
('Клиент2', 'Код юр лица2', 'Код ТТ2','SKU2', '01.01.2014', 100),
('Клиент2', 'Код юр лица2', 'Код ТТ2','SKU2', '02.01.2014', 100),
('Клиент2', 'Код юр лица2', 'Код ТТ2','SKU2', '03.01.2014', 100),
('Клиент3', 'Код юр лица3', 'Код ТТ1','SKU1', '01.01.2014', 100),
('Клиент3', 'Код юр лица3', 'Код ТТ1','SKU1', '02.01.2014', 100),
('Клиент3', 'Код юр лица3', 'Код ТТ1','SKU1', '03.01.2014', 100),
('Клиент3', 'Код юр лица3', 'Код ТТ2','SKU1', '01.01.2014', 100),
('Клиент3', 'Код юр лица3', 'Код ТТ2','SKU1', '02.01.2014', 100),
('Клиент3', 'Код юр лица3', 'Код ТТ2','SKU1', '03.01.2014', 100),
('Клиент3', 'Код юр лица3', 'Код ТТ3','SKU1', '01.01.2014', 100),
('Клиент3', 'Код юр лица3', 'Код ТТ3','SKU1', '02.01.2014', 100),
('Клиент3', 'Код юр лица3', 'Код ТТ3','SKU1', '03.01.2014', 100),
('Клиент3', 'Код юр лица3', 'Код ТТ4','SKU1', '01.01.2014', 100),
('Клиент3', 'Код юр лица3', 'Код ТТ4','SKU1', '02.01.2014', 100),
('Клиент3', 'Код юр лица3', 'Код ТТ4','SKU1', '03.01.2014', 100)

--Тип отбора ТТ
--1. Случайно отбирает ТТ по заданному проценту
--2. Случайно отбирает ТТ по заданному проценту, так чтобы для каждого клиента пропорционально отбирались ТТ.
--3. Случайно отбирает ТТ по заданному количеству
DECLARE @ТипОтбора INTEGER =3;

--Для типа отбора ТТ 1 и 2
DECLARE @ЗаданныйПроцентТТВыборка decimal(2,2) = 0.07;
DECLARE @РасcчитанноеКоличествоТТ INTEGER;
--Для типа отбора ТТ 3
DECLARE @ЗаданноеКоличествоТТВыборка integer = 2;

SET @РасcчитанноеКоличествоТТ = ROUND (@ЗаданныйПроцентТТВыборка * (SELECT count(*) FROM @Таблица),0);

SELECT
	[Клиент],
	[Код юр лица],
	[Код ТТ],	
	[Код продукции],
	[Дата],
	[Отгрузки штук]
FROM
	@Таблица
INNER JOIN	
	(CASE
		WHEN @ТипОтбора= 1 THEN

		WHEN @ТипОтбора= 2 THEN

		WHEN @ТипОтбора= 3 THEN	
			(SELECT TOP 1 
				Таб1.[Код ТТ]	
			FROM
				(SElECT DISTINCT [Код ТТ] FROM @Таблица) AS Таб1
			ORDER BY
				NEWID()) AS ФИЛЬТР_ТТ
	END)
ON
	@Таблица.[Код ТТ] = ФИЛЬТР_ТТ.[Код ТТ]
29 апр 18, 14:06    [21378702]     Ответить | Цитировать Сообщить модератору
 Re: Случайный отбор строк по заданным условиям  [new]
Glebanski
Member

Откуда: Msk ->NL
Сообщений: 306
ferzmikk,

Я пожалуй не постесняюсь и напишу, что еще не видел, как таблицу джойнят с результатом выражения CASE.
Если это не 80lvl владения T-SQL, то тогда ошибка. И плясать надо отсюда.

ЗЫ: https://www.mssqltips.com/sqlservertip/3157/different-ways-to-get-random-data-for-sql-server-data-sampling/
30 апр 18, 14:04    [21379830]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить