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

Откуда:
Сообщений: 55
У предмета есть четыре характеристики, выраженные целыми числами.
В таблице aTable_1 представлен некий фильтр этих характеристик - те же четыре целых числа, либо нулевые значения. Если в таблице стоит 0, то подходит любая характеристика предмета, если число - то только указанная.
Например:
х1 х2  х3  х4  N
0 2 0 0 10
1 0 0 5 25

предмет с характеристикой
100 2 3 8
подходит под первый фильтр, и в результате запроса я хочу получить число N (10)
предмет с характеристикой
1 2 3 5
подходит под оба фильтра, и в результате я хочу получить число 25 как максимальное из всех подходящих N.

запросы для создания таблицы и заполнения
CREATE TABLE [aTable_1](
	[x1] [int] NULL,
	[x2] [int] NULL,
	[x3] [int] NULL,
	[x4] [int] NULL,
	[N] [numeric](18, 0) NULL
) ON [PRIMARY]


INSERT INTO [aTable_1]
           ([x1]
           ,[x2]
           ,[x3]
           ,[x4]
           ,[N])
     VALUES
           (0,2,3,0,10)
INSERT INTO [aTable_1]
           ([x1]
           ,[x2]
           ,[x3]
           ,[x4]
           ,[N])
     VALUES
           (1,0,0,5,25)
15 фев 13, 17:42    [13933501]     Ответить | Цитировать Сообщить модератору
 Re: Правильно составить запрос  [new]
Glory
Member

Откуда:
Сообщений: 104751
Olivka
и в результате я хочу получить число 25 как максимальное из всех подходящих N.

И в чем проблема ?
TOP 1 + ORDER BY N desc
15 фев 13, 17:52    [13933593]     Ответить | Цитировать Сообщить модератору
 Re: Правильно составить запрос  [new]
Olivka
Member

Откуда:
Сообщений: 55
Glory,

Мне нужно проверить какому именно фильтру удовлетворяют произвольно заданные характеристики предмета. Отсортировать я умею.
15 фев 13, 17:54    [13933605]     Ответить | Цитировать Сообщить модератору
 Re: Правильно составить запрос  [new]
Glory
Member

Откуда:
Сообщений: 104751
Olivka
Мне нужно проверить какому именно фильтру удовлетворяют произвольно заданные характеристики предмета. Отсортировать я умею.

И что мешает проверять то ? Вы не можете сравнить значение в таблице с "произвольно заданными характеристиками предмета" ?
15 фев 13, 18:02    [13933670]     Ответить | Цитировать Сообщить модератору
 Re: Правильно составить запрос  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Olivka,

DECLARE @x1 INT, @x2 INT, @x3 INT, @x4 INT;

SELECT @x1 = 100, @x2 = 2, @x3 = 3, @x4 = 8;

SELECT TOP(1) a.N
FROM aTable_1 a
WHERE (@x1 = a.x1 OR a.x1 = 0) AND (@x2 = a.x2 OR a.x2 = 0) AND (@x3 = a.x3 OR a.x3 = 0) AND (@x3 = a.x3 OR a.x3 = 0)
ORDER BY a.N DESC;

SELECT @x1 = 1, @x2 = 2, @x3 = 3, @x4 = 5;

SELECT TOP(1) a.N
FROM aTable_1 a
WHERE (@x1 = a.x1 OR a.x1 = 0) AND (@x2 = a.x2 OR a.x2 = 0) AND (@x3 = a.x3 OR a.x3 = 0) AND (@x3 = a.x3 OR a.x3 = 0)
ORDER BY a.N DESC;
15 фев 13, 18:05    [13933701]     Ответить | Цитировать Сообщить модератору
 Re: Правильно составить запрос  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Ошибся при копипасте :-)
DECLARE @x1 INT, @x2 INT, @x3 INT, @x4 INT;

SELECT @x1 = 100, @x2 = 2, @x3 = 3, @x4 = 8;

SELECT TOP(1) a.N
FROM aTable_1 a
WHERE (@x1 = a.x1 OR a.x1 = 0) AND (@x2 = a.x2 OR a.x2 = 0) AND (@x3 = a.x3 OR a.x3 = 0) AND (@x4 = a.x4 OR a.x4 = 0)
ORDER BY a.N DESC;

SELECT @x1 = 1, @x2 = 2, @x3 = 3, @x4 = 5;

SELECT TOP(1) a.N
FROM aTable_1 a
WHERE (@x1 = a.x1 OR a.x1 = 0) AND (@x2 = a.x2 OR a.x2 = 0) AND (@x3 = a.x3 OR a.x3 = 0) AND (@x4 = a.x4 OR a.x4 = 0)
ORDER BY a.N DESC;
15 фев 13, 18:07    [13933707]     Ответить | Цитировать Сообщить модератору
 Re: Правильно составить запрос  [new]
Olivka
Member

Откуда:
Сообщений: 55
Гость333,

Спасибо!
Тут один случай не проходит, если характеристики заданы неполно, например

DECLARE @x1 INT, @x2 INT, @x3 INT, @x4 INT;

SELECT @x1 = 100, @x2 = 0, @x3 = 3, @x4 = 8;

SELECT TOP(1) a.N
FROM aTable_1 a
WHERE (@x1 = a.x1 OR a.x1 = 0) AND (@x2 = a.x2 OR a.x2 = 0) AND (@x3 = a.x3 OR a.x3 = 0) AND (@x4 = a.x4 OR a.x4 = 0)
ORDER BY a.N DESC;


должно выдавать 10-ку

Я вот так переписала
DECLARE @x1 INT, @x2 INT, @x3 INT, @x4 INT;

SELECT @x1 = 100, @x2 = 0, @x3 = 3, @x4 = 8;

SELECT TOP(1) a.N
FROM aTable_1 a
WHERE (@x1 = a.x1 OR a.x1 = 0 OR @x1 = 0) AND (@x2 = a.x2 OR a.x2 = 0 OR @x2 = 0) 
AND (@x3 = a.x3 OR a.x3 = 0 OR @x3 = 0) AND (@x4 = a.x4 OR a.x4 = 0 OR @x4 = 0)
ORDER BY a.N DESC;


Как-то очень просто все, мне казалось должно быть сложнее.. )
15 фев 13, 18:18    [13933781]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить