Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Вопрос про фильтр / 20 сообщений из 20, страница 1 из 1
15.10.2021, 19:38
    #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
15.10.2021, 21:02
    #40104824
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про фильтр
ferzmikk
, то в WHERE насколько корректно писать так?
Некорректно
...
Рейтинг: 0 / 0
15.10.2021, 21:06
    #40104825
godsql
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про фильтр
Главное сомнение должно быть: а "0" ли "null"?
а по запросу: isnull(*,0) должно стоять в where
...
Рейтинг: 0 / 0
15.10.2021, 21:07
    #40104826
ferzmikk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про фильтр
alexeyvg,

Вариант 1 тоже некорректно?
...
Рейтинг: 0 / 0
15.10.2021, 21:08
    #40104827
Gerasimenko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про фильтр
...
Рейтинг: 0 / 0
15.10.2021, 21:10
    #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
15.10.2021, 21:17
    #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
16.10.2021, 12:56
    #40104920
iap
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
16.10.2021, 12:58
    #40104922
iap
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
16.10.2021, 14:41
    #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
16.10.2021, 17:48
    #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
16.10.2021, 20:58
    #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
16.10.2021, 22:56
    #40104984
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про фильтр
alexeyvg
Работать будет, конкретно для сравнения с 0
А с другими числами или строками или датами и т.п. уже не будет?
...
Рейтинг: 0 / 0
17.10.2021, 01:03
    #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
17.10.2021, 11:17
    #40105008
iap
iap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про фильтр
Согласно постановке задачи из первого поста в WHERE надо использовать OR, а не AND.
ferzmikk
одновременно не нулевые
То есть, либо одно значение ненулевое, либо другое
...
Рейтинг: 0 / 0
17.10.2021, 14:48
    #40105033
ferzmikk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про фильтр
iap,

Так то верно, по условию OR получается. Но тут обсуждается акцент на вопрос: насколько корректно и безопасно оставлять такую запись
Код: sql
1.
Мера1 <> 0 OR Мера2 <> 0
...
Рейтинг: 0 / 0
17.10.2021, 15:12
    #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
17.10.2021, 15:17
    #40105035
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про фильтр
ferzmikk
Но тут обсуждается акцент на вопрос: насколько корректно и безопасно оставлять такую запись
Код: sql
1.
Мера1 <> 0 OR Мера2 <> 0

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

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

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

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

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

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

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

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


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