SQL группировка, создание дублей

введите сюда описание изображения

Добрый день, подскажите , могу ли я с помощью MYSQL 5.7 из двух записей сделать 8 то есть мне нужно продублировать записи и сделать к примеру с первой строки

H067  S070
2      01
2      03 
2      #
2      05

на скрине это результат выборки который мне нужно еще отработать

UPDATE вот набросал чтото примерное

    DROP TABLE IF EXISTS new_table;
CREATE TABLE IF NOT EXISTS new_table (
                            id int AUTO_INCREMENT,
                            name varchar(255),
                            date_start DATE NULL,
                            date_operation DATE NULL,
                            date_return DATE NULL,
                            params_1 int,
                            params_2 int,
                            params_3 int,
                            PRIMARY KEY(id)) DEFAULT CHARACTER SET UTF8 COLLATE `UTF8_unicode_ci`;

INSERT INTO new_table (name, date_start, date_operation, date_return, params_1, params_2, params_3)
VALUES ('название_1', '2023-01-01', '2023-01-05', '2023-05-05', 1, 1, 0),
 ('название_2', '2023-05-01', '2023-08-05', null, 1, 1, 0),
 ('название_3', '2023-06-01', '2023-09-05', '2023-05-05', 1, 1, 0),
 ('название_4', '2023-07-01', '2023-10-05', '2023-05-05', 1, 1, 0),
 ('название_5', '2023-08-01', '2023-11-05', null, 1, 1, 0),
 ('название_6', '2023-09-01', '2023-12-05', '2023-05-05', 1, 1, 0),
 ('название_7', '2023-10-01', '2024-01-05', null, 1, 1, 0),
 ('название_8', '2023-11-01', '2021-02-05', '2023-05-05', 1, 1, 0);

select
    t1.id,
    t1.H067,
       CASE WHEN params_1 = 1 AND date_return is NULL THEN '01' ELSE '#' END as 'S070_01',
       CASE WHEN params_2 = 1 AND date_operation is NOT NULL THEN '03' ELSE '#' END as 'S070_03',
       CASE WHEN params_3 = 1 AND params_2 = 1 THEN '04' ELSE '#' END as 'S070_04'

from (
         select *,
                '1' as 'H067'
         from new_table
         where date_start > '2023-09-01'
         UNION ALL
         select *,
                '2' as 'H067'
         from new_table
         where date_operation > '2023-07-01' and  date_operation < '2023-12-31'
         UNION ALL
         select *,
                '3' as 'H067'
         from new_table
         where date_return is null
     ) as t1

по итогу мне нужно 2 столбца H067 S070 введите сюда описание изображения только чтобы H067 имел все условия

нюансы что new_table имеет несколько милионов записей и джоитится также к много милионным записям


Ответы (1 шт):

Автор решения: Akina

Шаблон для дублирования записей в таблице:

INSERT INTO tablename ( {список полей без поля автоинкремента} )
SELECT {список полей без поля автоинкремента}
FROM tablename 
CROSS JOIN  (SELECT 1 UNION SELECT 2 UNION  .. SELECT N) numbers
WHERE {дополнительные условия}

N - максимальное количество создаваемых копий.

Дополнительные условия могут ограничивать количество копий отдельных записей.

В списке выходного набора SELECT-части можно модифицировать вставляемые значения.

Если первичный ключ - не автоинкремент, следует в списке вывода SELECT формировать уникальное значение для ПК соотв. выражением.

Если количество нужных копий велико, можно CROSSJOIN-ить несколько синтетических таблиц. Также вместо синтетической таблицы чисел можно использовать рекурсивный CTE. Но не в случае MySQL 5.x, который их не поддерживает.

→ Ссылка