Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Случайный отбор строк по заданным условиям / 2 сообщений из 2, страница 1 из 1
29.04.2018, 14:06
    #39638303
ferzmikk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Случайный отбор строк по заданным условиям
Здравствуйте!

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

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

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

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

SQL-запрос
Код: 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.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
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
	@Таблица.[Код ТТ] = ФИЛЬТР_ТТ.[Код ТТ]

...
Рейтинг: 0 / 0
30.04.2018, 14:04
    #39638489
Glebanski
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Случайный отбор строк по заданным условиям
ferzmikk,

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

ЗЫ: https://www.mssqltips.com/sqlservertip/3157/different-ways-to-get-random-data-for-sql-server-data-sampling/
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Случайный отбор строк по заданным условиям / 2 сообщений из 2, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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