powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Вопрос про фильтр
20 сообщений из 20, страница 1 из 1
Вопрос про фильтр
    #40104817
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте!

Есть исходные данные.
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.
DECLARE @Table1 TABLE(
	ГруппаSKU VARCHAR(20),
	SKU VARCHAR(10),
	Дата INTEGER,
	Мера1 INTEGER,
	Мера2 INTEGER
);

INSERT INTO @Table1 
	(ГруппаSKU, SKU, Дата, Мера1, Мера2)
VALUES
	('ГруппаSKU 1', 'SKU 1', 202001, 10, 20),
	('ГруппаSKU 1', 'SKU 1', 202101, 10, 20),
	('ГруппаSKU 1', 'SKU 2', 202001, 10, 20),
	('ГруппаSKU 1', 'SKU 2', 202101, 10, 20),
	('ГруппаSKU 2', 'SKU 3', 202001, 10, 20),
	('ГруппаSKU 2', 'SKU 3', 202101, Null, 20),
	('ГруппаSKU 2', 'SKU 4', 202001, 10, Null),
	('ГруппаSKU 2', 'SKU 4', 202101, Null, Null),
	('ГруппаSKU 3', 'SKU 5', 202001, 10, 20),
	('ГруппаSKU 3', 'SKU 5', 202101, 0, 20),
	('ГруппаSKU 3', 'SKU 6', 202001, 10, 0),
	('ГруппаSKU 3', 'SKU 6', 202101, 0, 0);

DECLARE @Table2 TABLE(
	ГруппаSKU VARCHAR(20),
	Код VARCHAR(10)	
	);

INSERT INTO @Table2
	(ГруппаSKU, Код)
VALUES
	('ГруппаSKU 1', '0001'),
	('ГруппаSKU 2', '0002'),
	('ГруппаSKU 3', '0003');

Нужно выгрузить все строки, которые Мера1 и Мера2 одновременно не нулевые.

Написал такой запрос.
SQL
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
SELECT
	t1.ГруппаSKU,
	t1.SKU,
	t2.Код,	
	ISNULL(t1.Мера1, 0) AS Мера1,
	ISNULL(t1.Мера2, 0) AS Мера2 
FROM
	@Table1 t1
LEFT JOIN
	@Table2 t2
ON
	t1.ГруппаSKU = t2.ГруппаSKU
WHERE
	--Вариант 1
	--ISNULL(t1.Мера1, 0) <> 0
	--AND
	--ISNULL(t1.Мера2, 0) <> 0

	--Вариант 2
	Мера1 <> 0
	AND
	Мера2 <> 0

Результат запроса правильный. Но у меня есть сомнения.

Учитывая, что в SELECT используется
Код: sql
1.
2.
ISNULL(t1.Мера1, 0) AS Мера1,
ISNULL(t1.Мера2, 0) AS Мера2 

, то в WHERE насколько корректно писать так?
Код: sql
1.
2.
3.
Мера1 <> 0
AND
Мера2 <> 0
...
Рейтинг: 0 / 0
Вопрос про фильтр
    #40104824
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ferzmikk
, то в WHERE насколько корректно писать так?
Некорректно
...
Рейтинг: 0 / 0
Вопрос про фильтр
    #40104825
godsql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Главное сомнение должно быть: а "0" ли "null"?
а по запросу: isnull(*,0) должно стоять в where
...
Рейтинг: 0 / 0
Вопрос про фильтр
    #40104826
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvg,

Вариант 1 тоже некорректно?
...
Рейтинг: 0 / 0
Вопрос про фильтр
    #40104827
Gerasimenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Вопрос про фильтр
    #40104828
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Получается лучше так оставить?

SQL
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
SELECT
	*
FROM
	(SELECT
		t1.ГруппаSKU,
		t1.SKU,
		t2.Код,	
		ISNULL(t1.Мера1, 0) AS Мера1,
		ISNULL(t1.Мера2, 0) AS Мера2 
	FROM
		@Table1 t1
	LEFT JOIN
		@Table2 t2
	ON
		t1.ГруппаSKU = t2.ГруппаSKU) Tab1
WHERE
	Мера1 <> 0
	AND
	Мера2 <> 0

...
Рейтинг: 0 / 0
Вопрос про фильтр
    #40104829
Gerasimenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ferzmikk
Получается лучше так оставить?

SQL
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
SELECT
	*
FROM
	(SELECT
		t1.ГруппаSKU,
		t1.SKU,
		t2.Код,	
		ISNULL(t1.Мера1, 0) AS Мера1,
		ISNULL(t1.Мера2, 0) AS Мера2 
	FROM
		@Table1 t1
	LEFT JOIN
		@Table2 t2
	ON
		t1.ГруппаSKU = t2.ГруппаSKU) Tab1
WHERE
	Мера1 <> 0
	AND
	Мера2 <> 0


нет. Если уж так хочется:
Код: sql
1.
2.
3.
4.
select A.field1, A.field2...
 from
    (select ...) A
  where A.field3<>0 and A.Field4<>0
...
Рейтинг: 0 / 0
Вопрос про фильтр
    #40104920
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
SELECT
 t1.ГруппаSKU,
 t1.SKU,
 t2.Код,	
 ISNULL(t1.Мера1, 0) AS Мера1,
 ISNULL(t1.Мера2, 0) AS Мера2 
FROM @Table1 t1 LEFT JOIN @Table2 t2 ON t1.ГруппаSKU = t2.ГруппаSKU
WHERE NOT EXISTS (SELECT NULLIF(t1.Мера1,0), NULLIF(t1.Мера2,0) INTERSECT SELECT NULL, NULL);
...
Рейтинг: 0 / 0
Вопрос про фильтр
    #40104922
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gerasimenko
ferzmikk
Получается лучше так оставить?

SQL
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
SELECT
	*
FROM
	(SELECT
		t1.ГруппаSKU,
		t1.SKU,
		t2.Код,	
		ISNULL(t1.Мера1, 0) AS Мера1,
		ISNULL(t1.Мера2, 0) AS Мера2 
	FROM
		@Table1 t1
	LEFT JOIN
		@Table2 t2
	ON
		t1.ГруппаSKU = t2.ГруппаSKU) Tab1
WHERE
	Мера1 <> 0
	AND
	Мера2 <> 0



нет. Если уж так хочется:
Код: sql
1.
2.
3.
4.
select A.field1, A.field2...
 from
    (select ...) A
  where A.field3<>0 and A.Field4<>0

Вообще-то, требуется, чтобы поля были ненулевыми ОДНОВРЕМЕННО.
Поэтому AND - неправильно
...
Рейтинг: 0 / 0
Вопрос про фильтр
    #40104941
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ferzmikk,

Код: sql
1.
2.
3.
4.
5.
6.
select
 *
from
 (values (1, 2), (3, 0), (4, null), (0, 0), (0, null), (null, 0), (null, null)) t (a, b)
where
 a <> 0 and b <> 0
...
Рейтинг: 0 / 0
Вопрос про фильтр
    #40104953
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvg
ferzmikk
, то в WHERE насколько корректно писать так?
Некорректно
invm
ferzmikk,
Код: sql
1.
2.
3.
4.
5.
6.
select
 *
from
 (values (1, 2), (3, 0), (4, null), (0, 0), (0, null), (null, 0), (null, null)) t (a, b)
where
 a <> 0 and b <> 0

Пишут же, что так некорректно писать.
...
Рейтинг: 0 / 0
Вопрос про фильтр
    #40104962
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ferzmikk
Пишут же, что так некорректно писать.

Работать будет, конкретно для сравнения с 0, но как то неаккуратненько. Будут какие то ошибки, если кто то будет позже менять условия, или для других формул.
Лучше в подзапрос формулы, а не повторять их и в SELECT, и в WHERE

И вообще, если уж писать:
Код: sql
1.
2.
3.
4.
-- Вариант 2
	Мера1 <> 0
	AND
	Мера2 <> 0


то зачем:
Код: sql
1.
2.
3.
4.
SELECT
	...
	ISNULL(t1.Мера1, 0) AS Мера1,
	ISNULL(t1.Мера2, 0) AS Мера2 

?
Тогда уж
Код: sql
1.
2.
3.
4.
SELECT
	...
	t1.Мера1,
	t1.Мера2
...
Рейтинг: 0 / 0
Вопрос про фильтр
    #40104984
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvg
Работать будет, конкретно для сравнения с 0
А с другими числами или строками или датами и т.п. уже не будет?
...
Рейтинг: 0 / 0
Вопрос про фильтр
    #40104993
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm
alexeyvg
Работать будет, конкретно для сравнения с 0
А с другими числами или строками или датами и т.п. уже не будет?
Ну вот, например, результат двух запросов разный:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
select
 isnull(a, 0) as a,
 isnull(b, 0) as b
from
 (values (1, 2), (3, 3), (4, null), (0, 0), (0, null), (null, 0), (null, null)) t (a, b)
where
 a <> 3 and b <> 3

select
 isnull(a, 0) as a,
 isnull(b, 0) as b
from
 (values (1, 2), (3, 3), (4, null), (0, 0), (0, null), (null, 0), (null, null)) t (a, b)
where
 isnull(a, 0) <> 3 and isnull(b, 0) <> 3


Просто если ставится задача "тут на экране есть строки, в которых (тут некая формула с этими полями), сделай, что бы они не выводились", концептуально правильно делать фильтр на то, что "на экране", а не на исходные данные.
Меньше вероятность ошибок, проще поддержка. Что бы не исправлять потом ошибки, приговаривая "ну, это другое" :-)
Хотя это не всегда оптимально по производительности, поэтому иногда можно и исходные данные фильтровать.
...
Рейтинг: 0 / 0
Вопрос про фильтр
    #40105008
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Согласно постановке задачи из первого поста в WHERE надо использовать OR, а не AND.
ferzmikk
одновременно не нулевые
То есть, либо одно значение ненулевое, либо другое
...
Рейтинг: 0 / 0
Вопрос про фильтр
    #40105033
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iap,

Так то верно, по условию OR получается. Но тут обсуждается акцент на вопрос: насколько корректно и безопасно оставлять такую запись
Код: sql
1.
Мера1 <> 0 OR Мера2 <> 0
...
Рейтинг: 0 / 0
Вопрос про фильтр
    #40105034
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ferzmikk
Так то верно, по условию OR получается.
Не понимаю.
iap
Согласно постановке задачи из первого поста в WHERE надо использовать OR, а не AND.
ferzmikk
одновременно не нулевые
То есть, либо одно значение ненулевое, либо другое
Не понимаю, почему OR?
И как условие "одновременно не нулевые" трансформировалось в "либо одно значение ненулевое, либо другое"?

Если у записи одно из значений 2-х полей полей ненулевое то Мера1 <> 0 OR Мера2 <> 0 покажут такую запись, а не надо, потому что у неё не выполняется условие "одновременно не нулевые"

Например, показывается запись 5, 0, которая не соответствует условию "все строки, которые Мера1 и Мера2 одновременно не нулевые.".
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
select
	a, b,
	isnull(a, 0) as a,
	isnull(b, 0) as b
from
 (values (1, 2), (3, 3), (4, null), (0, 0), (5, 0), (0, null), (null, 0), (null, null)) t (a, b)
where
 a <> 0 or b <> 0
...
Рейтинг: 0 / 0
Вопрос про фильтр
    #40105035
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ferzmikk
Но тут обсуждается акцент на вопрос: насколько корректно и безопасно оставлять такую запись
Код: sql
1.
Мера1 <> 0 OR Мера2 <> 0

Я писал выше - конкретно для этих условий правильно.

Но у вас там будет 50 полей, куча формул, вы будете лепить и постоянно менять условия по заданиям, и будет сложно отслеживать, какие условия можно перенести на исходные данные, а какие нужно накладывать на результат.

Я бы посоветовал сделать вычисления по формулам в подзапросе, а снаружи наложить фильтры и условия, в точности как сказано в задании, будет меньше затрат, и меньше вероятность ошибки.
Не забывая, что на вычисленных значениях индексы могут не использоваться.
...
Рейтинг: 0 / 0
Вопрос про фильтр
    #40105041
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ferzmikk
Нужно выгрузить все строки, которые Мера1 и Мера2 одновременно не нулевые.
alexeyvg
ferzmikk
Так то верно, по условию OR получается.
Не понимаю.
Вообще, практически, в исходнике, если эти меры нулевые, то одновременно нулевые. Там пока в самом исходнике (не тот тестовый, который в первом посту) не встречал либо одно значение ненулевое, либо другое.

Запустил это скрипт отдельно с OR и отдельно с AND. Вижу разницу. Хотя в моем случае больше подходит AND. Но для данного рассматриваемого вопроса это не важно.
...
Рейтинг: 0 / 0
Вопрос про фильтр
    #40105042
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvg
Я писал выше - конкретно для этих условий правильно.

Но у вас там будет 50 полей, куча формул, вы будете лепить и постоянно менять условия по заданиям , и будет сложно отслеживать, какие условия можно перенести на исходные данные, а какие нужно накладывать на результат.
Но там нужно отсекать именно ненулевые. Что касается дополнительных полей и фильтров в будущем, то именно для такого запроса не будет. Следовательно, как я понял из вышеописанного Вами в этом случае можно спокойно писать так
Код: sql
1.
Мера1 <> 0 AND Мера2 <> 0

И будет хотя бы оптимально по производительности.

Я бы посоветовал сделать вычисления по формулам в подзапросе, а снаружи наложить фильтры и условия, в точности как сказано в задании, будет меньше затрат, и меньше вероятность ошибки.
Не забывая, что на вычисленных значениях индексы могут не использоваться.Ок, если поля будут добавляться.

Спасибо за подробный разбор!
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Вопрос про фильтр
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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