clear markdown compare help donate or buy diddy dollings comments/suggestions/bugs a leap of faith? bible365
clear markdown donate comments/suggestions/bugs a leap of faith? bible365 diddy dollings
By using db<>fiddle, you agree to license everything you submit by Creative Commons CC0. 818532 fiddles created (9189 in the last week).

CREATE TABLE IF NOT EXISTS `example_table` ( `id` int unsigned NOT NULL, `name` varchar(200) NOT NULL, `category` varchar(200) NOT NULL, `option_a` varchar(200) NULL, `option_b` varchar(200) NULL, `option_c` varchar(200) NULL, `option_d` varchar(200) NULL, PRIMARY KEY (`id`) ) DEFAULT CHARSET=utf8;
 hidden batch(es)


INSERT INTO `example_table` (`id`, `name`, `category`, `option_a`, `option_b`, `option_c`, `option_d`) VALUES -- Записи 1,2 должны быть сгруппированы только по полю option_a и -- проигнорированы(исключены) для группировки по остальным полям, несмотря на то, что также могут быть -- сгруппированы по полям option_b, option_c, option_d(#2) ('1', 'Запчасть (поле A)', 'Станки', 'a0000000', 'b000001', 'c000000000', null), ('2', 'Запчасть (поле A)', 'Станки', 'a0000000', 'b000001', 'c000000000', 'd123000054'), -- Записи 3,4,5 должны быть сгруппированы только по полю option_b и -- проигнорированы(исключены) для группировки по остальным полям, несмотря на то, что также могут быть -- сгруппированы по полям option_c, option_d ('3', 'Запчасть (поле B)', 'Станки', 'a0000001', 'b000001', null, 'd123000054'), ('4', 'Запчасть (поле B)', 'Станки', 'a0000055', 'b000001', 'c005500000', 'd123000054'), ('5', 'Запчасть (поле B)', 'Станки', 'a0000277', 'b000001', 'c005500000', 'd123000054'), -- Записи 6,7,8 должны быть сгруппированы только по полю option_c и -- проигнорированы(исключены) для группировки по остальным полям, несмотря на то, что также могут быть -- сгруппированы по полю option_d ('6', 'Запчасть (поле C)', 'Станки', null, 'b000543', 'c005500000', 'd123000054'), ('7', 'Запчасть (поле C)', 'Станки', null, 'b000789', 'c005500000', 'd123000054'), ('8', 'Запчасть (поле C)', 'Станки', 'a0004787', 'b000055', 'c005500000', 'd123000054'), -- Записи 9,10 должны быть сгруппированы по полю option_d ('9', 'Запчасть (поле D)', 'Станки', 'a0063777', 'b000056', 'c001300000', 'd123000054'), ('10', 'Запчасть (поле D)', 'Станки', 'a0700787', 'b000058', 'c001400000', 'd123000054'), -- Записи 11,12 не попадают под группировку, т.к. все значения в полях option_* уникальны ('11', 'Запчасть без группы №1', 'Станки', 'a7463777', 'b005454', 'c651300000', 'd161271054'), ('12', 'Запчасть без группы №2', 'Станки', 'a9799987', 'b007676', 'c861400000', 'd981726374'); SELECT * FROM example_table;
id name category option_a option_b option_c option_d
1 Запчасть (поле A) Станки a0000000 b000001 c000000000
2 Запчасть (поле A) Станки a0000000 b000001 c000000000 d123000054
3 Запчасть (поле B) Станки a0000001 b000001 d123000054
4 Запчасть (поле B) Станки a0000055 b000001 c005500000 d123000054
5 Запчасть (поле B) Станки a0000277 b000001 c005500000 d123000054
6 Запчасть (поле C) Станки b000543 c005500000 d123000054
7 Запчасть (поле C) Станки b000789 c005500000 d123000054
8 Запчасть (поле C) Станки a0004787 b000055 c005500000 d123000054
9 Запчасть (поле D) Станки a0063777 b000056 c001300000 d123000054
10 Запчасть (поле D) Станки a0700787 b000058 c001400000 d123000054
11 Запчасть без группы №1 Станки a7463777 b005454 c651300000 d161271054
12 Запчасть без группы №2 Станки a9799987 b007676 c861400000 d981726374
 hidden batch(es)


WITH cte_a AS ( SELECT *, COUNT(option_a) OVER (PARTITION BY option_a) cnt_a FROM example_table ) SELECT * FROM cte_a ORDER BY id
id name category option_a option_b option_c option_d cnt_a
1 Запчасть (поле A) Станки a0000000 b000001 c000000000 2
2 Запчасть (поле A) Станки a0000000 b000001 c000000000 d123000054 2
3 Запчасть (поле B) Станки a0000001 b000001 d123000054 1
4 Запчасть (поле B) Станки a0000055 b000001 c005500000 d123000054 1
5 Запчасть (поле B) Станки a0000277 b000001 c005500000 d123000054 1
6 Запчасть (поле C) Станки b000543 c005500000 d123000054 0
7 Запчасть (поле C) Станки b000789 c005500000 d123000054 0
8 Запчасть (поле C) Станки a0004787 b000055 c005500000 d123000054 1
9 Запчасть (поле D) Станки a0063777 b000056 c001300000 d123000054 1
10 Запчасть (поле D) Станки a0700787 b000058 c001400000 d123000054 1
11 Запчасть без группы №1 Станки a7463777 b005454 c651300000 d161271054 1
12 Запчасть без группы №2 Станки a9799987 b007676 c861400000 d981726374 1
 hidden batch(es)


WITH cte_a AS ( SELECT *, COUNT(option_a) OVER (PARTITION BY option_a) cnt_a FROM example_table ), cte_b AS ( SELECT *, CASE WHEN cnt_a > 1 THEN 0 ELSE COUNT(option_b) OVER (PARTITION BY option_b, cnt_a > 1) END cnt_b FROM cte_a) SELECT * FROM cte_b ORDER BY id
id name category option_a option_b option_c option_d cnt_a cnt_b
1 Запчасть (поле A) Станки a0000000 b000001 c000000000 2 0
2 Запчасть (поле A) Станки a0000000 b000001 c000000000 d123000054 2 0
3 Запчасть (поле B) Станки a0000001 b000001 d123000054 1 3
4 Запчасть (поле B) Станки a0000055 b000001 c005500000 d123000054 1 3
5 Запчасть (поле B) Станки a0000277 b000001 c005500000 d123000054 1 3
6 Запчасть (поле C) Станки b000543 c005500000 d123000054 0 1
7 Запчасть (поле C) Станки b000789 c005500000 d123000054 0 1
8 Запчасть (поле C) Станки a0004787 b000055 c005500000 d123000054 1 1
9 Запчасть (поле D) Станки a0063777 b000056 c001300000 d123000054 1 1
10 Запчасть (поле D) Станки a0700787 b000058 c001400000 d123000054 1 1
11 Запчасть без группы №1 Станки a7463777 b005454 c651300000 d161271054 1 1
12 Запчасть без группы №2 Станки a9799987 b007676 c861400000 d981726374 1 1
 hidden batch(es)


WITH cte_a AS ( SELECT *, COUNT(option_a) OVER (PARTITION BY option_a) cnt_a FROM example_table ), cte_b AS ( SELECT *, CASE WHEN cnt_a > 1 THEN 0 ELSE COUNT(option_b) OVER (PARTITION BY option_b, cnt_a > 1) END cnt_b FROM cte_a), cte_c AS ( SELECT *, CASE WHEN (cnt_a > 1) OR (cnt_b > 1) THEN 0 ELSE COUNT(option_c) OVER (PARTITION BY option_c, cnt_a > 1, cnt_b > 1) END cnt_c FROM cte_b) SELECT * FROM cte_c ORDER BY id
id name category option_a option_b option_c option_d cnt_a cnt_b cnt_c
1 Запчасть (поле A) Станки a0000000 b000001 c000000000 2 0 0
2 Запчасть (поле A) Станки a0000000 b000001 c000000000 d123000054 2 0 0
3 Запчасть (поле B) Станки a0000001 b000001 d123000054 1 3 0
4 Запчасть (поле B) Станки a0000055 b000001 c005500000 d123000054 1 3 0
5 Запчасть (поле B) Станки a0000277 b000001 c005500000 d123000054 1 3 0
6 Запчасть (поле C) Станки b000543 c005500000 d123000054 0 1 3
7 Запчасть (поле C) Станки b000789 c005500000 d123000054 0 1 3
8 Запчасть (поле C) Станки a0004787 b000055 c005500000 d123000054 1 1 3
9 Запчасть (поле D) Станки a0063777 b000056 c001300000 d123000054 1 1 1
10 Запчасть (поле D) Станки a0700787 b000058 c001400000 d123000054 1 1 1
11 Запчасть без группы №1 Станки a7463777 b005454 c651300000 d161271054 1 1 1
12 Запчасть без группы №2 Станки a9799987 b007676 c861400000 d981726374 1 1 1
 hidden batch(es)


WITH cte_a AS ( SELECT *, COUNT(option_a) OVER (PARTITION BY option_a) cnt_a FROM example_table ), cte_b AS ( SELECT *, CASE WHEN cnt_a > 1 THEN 0 ELSE COUNT(option_b) OVER (PARTITION BY option_b, cnt_a > 1) END cnt_b FROM cte_a), cte_c AS ( SELECT *, CASE WHEN (cnt_a > 1) OR (cnt_b > 1) THEN 0 ELSE COUNT(option_c) OVER (PARTITION BY option_c, cnt_a > 1, cnt_b > 1) END cnt_c FROM cte_b), cte_d AS ( SELECT *, CASE WHEN (cnt_a > 1) OR (cnt_b > 1) OR (cnt_c > 1) THEN 0 ELSE COUNT(option_d) OVER (PARTITION BY option_d, cnt_a > 1, cnt_b > 1, cnt_c > 1) END cnt_d FROM cte_c) SELECT * FROM cte_d ORDER BY id
id name category option_a option_b option_c option_d cnt_a cnt_b cnt_c cnt_d
1 Запчасть (поле A) Станки a0000000 b000001 c000000000 2 0 0 0
2 Запчасть (поле A) Станки a0000000 b000001 c000000000 d123000054 2 0 0 0
3 Запчасть (поле B) Станки a0000001 b000001 d123000054 1 3 0 0
4 Запчасть (поле B) Станки a0000055 b000001 c005500000 d123000054 1 3 0 0
5 Запчасть (поле B) Станки a0000277 b000001 c005500000 d123000054 1 3 0 0
6 Запчасть (поле C) Станки b000543 c005500000 d123000054 0 1 3 0
7 Запчасть (поле C) Станки b000789 c005500000 d123000054 0 1 3 0
8 Запчасть (поле C) Станки a0004787 b000055 c005500000 d123000054 1 1 3 0
9 Запчасть (поле D) Станки a0063777 b000056 c001300000 d123000054 1 1 1 2
10 Запчасть (поле D) Станки a0700787 b000058 c001400000 d123000054 1 1 1 2
11 Запчасть без группы №1 Станки a7463777 b005454 c651300000 d161271054 1 1 1 1
12 Запчасть без группы №2 Станки a9799987 b007676 c861400000 d981726374 1 1 1 1
 hidden batch(es)


WITH cte_a AS ( SELECT *, COUNT(option_a) OVER (PARTITION BY option_a) cnt_a FROM example_table ), cte_b AS ( SELECT *, CASE WHEN cnt_a > 1 THEN 0 ELSE COUNT(option_b) OVER (PARTITION BY option_b, cnt_a > 1) END cnt_b FROM cte_a), cte_c AS ( SELECT *, CASE WHEN (cnt_a > 1) OR (cnt_b > 1) THEN 0 ELSE COUNT(option_c) OVER (PARTITION BY option_c, cnt_a > 1, cnt_b > 1) END cnt_c FROM cte_b), cte_d AS ( SELECT *, CASE WHEN (cnt_a > 1) OR (cnt_b > 1) OR (cnt_c > 1) THEN 0 ELSE COUNT(option_d) OVER (PARTITION BY option_d, cnt_a > 1, cnt_b > 1, cnt_c > 1) END cnt_d FROM cte_c), cte_x AS ( SELECT id, name, category, CASE WHEN cnt_a > 1 THEN 'option_a' WHEN cnt_b > 1 THEN 'option_b' WHEN cnt_c > 1 THEN 'option_c' WHEN cnt_d > 1 THEN 'option_d' ELSE 'option_z' END group_type FROM cte_d ) SELECT GROUP_CONCAT(id ORDER BY id) ids, name, category, ANY_VALUE(group_type) group_type FROM cte_x GROUP BY CASE WHEN group_type = 'option_z' THEN id ELSE group_type END, name, category ORDER BY group_type, ids
ids name category group_type
1,2 Запчасть (поле A) Станки option_a
3,4,5 Запчасть (поле B) Станки option_b
6,7,8 Запчасть (поле C) Станки option_c
9,10 Запчасть (поле D) Станки option_d
11 Запчасть без группы №1 Станки option_z
12 Запчасть без группы №2 Станки option_z
 hidden batch(es)