Mysql
 sql >> база данни >  >> RDS >> Mysql

MySQL:изберете, групирайте и трансформирайте редове в отделни колони :)

Вашите данни са малко трудни за обработка.

За да направите обобщена таблица, колоните трябва да са уникални, дори повече, че могат да се появят и пет kis.

Доста е грозен и работи с myslq 5.7

Схема (MySQL v5.7)

СЪЗДАВАНЕ НА ТАБЛИЦА служители ( `id` INTEGER, `emp` VARCHAR(5));INSERT INTO служители (`id`, `emp`)СТОЙНОСТИ ('1', 'emp-A'), ( '2', 'emp-B'), ('3', 'emp-C'); CREATE TABLE роднини ( `id` INTEGER, `emp_id` INTEGER, `релация` VARCHAR(6), `относителна` VARCHAR( 8), `рождена дата` ДАТА); ВМЪКНЕТЕ В роднини (`id`, `emp_id`, `relation`, `роднина`, `рождена дата`) СТОЙНОСТИ ('1', '1', 'съпруг', 'съпруг- A', '1970-01-01'), ('2', '1', 'kid', 'kid-A1', '1971-01-02'), ('3', '1', ' дете', 'дете-A2', '1972-01-01'), ('4', '1', 'дете', 'дете-A3', '1973-01-01'), ('5' , '2', 'съпруг', 'съпруг-B', '1980-02-01'), ('6', '2', 'kid', 'kid-B1', '1981-02-01' ), ('7', '2', 'kid', 'kid-B2', '1982-02-01'), ('8', '3', 'kid', 'kid-C1', ' 1991-03-01'), ('9', '3', 'kid', 'kid-C2', '1992-03-01'); 

Заявка №1

SELECT GROUP_CONCAT(DISTINCT CONCAT( 'MAX(случай, когато `relation` ="', `relation`, '" след това `relation` край) AS `', relation, '`', ',MAX( случай, когато `relation` ="', `relation`, '" след това `birthdate` край) AS `', 'birthdate_',relation, ''`' ) ПОРЪЧАЙТЕ ПО номер на ред ) В @sqlFROM (ИЗБЕРЕТЕ `relation` ,номер на редFROM служители e INNER JOIN (SELECT IF(`relation` ='kid',IF (@empid =`emp_id`,@rn:=@rn+1,@rn:=1),IF (@empid =`emp_id`,@ rn:=@rn,@rn:=0)) номер на ред ,IF(`връзка` ='дете',CONCAT(`връзка`,@rn),`връзка`) връзка , `роднина` , `рождена дата` ,@ empid :=`emp_id` emp_idFROM (SELECT * FROM роднини ORDER BY `emp_id`,FIELD(`relation`,"supouse","kid"),`birthdate`) rel ,(SELECT @empid :=0) a1 ,( SELECT @rn :=0) a2) r ON e.id =r.emp_id) t1;SET @sql =CONCAT("SELECT MIN(`emp`), ", @sql, " FROM (SELECT `emp_id`, `emp` , `отношение` ,номер на ред , `роднина` , `рождена дата` ОТ служители e INNER JOIN (SELECT IF(`relation` ='kid',IF (@empid =`emp_id`,@rn:=@rn+ 1,@rn:=1),IF (@empid =`emp_id`,@rn:=@rn,@rn:=0)) номер на ред ,IF(`relation` ='kid',CONCAT(`relation`, @rn),`relation`) 'relation' , `relate` , `birthdate` ,@empid :=`emp_id` 'emp_id' FROM (SELECT * FROM роднини ORDER BY `emp_id`,FIELD(`relation`,'spouse ','дете'),'рождена дата`) отн ,(SELECT @empid :=0) a1 ,(SELECT @rn :=0) a2) r ON e.id =r.emp_id) t1 GROUP BY `emp_id`");PREPARE stmt FROM @sql;EXECUTE stmt;DEALLOCATE ПОДГОТВЕТЕ stmt; 
<предварителен код>| MIN(`emp`) | съпруг | рождена дата_съпруг | дете1 | рождена дата_kid1 | дете2 | рождена дата_kid2 | дете3 | рождена дата_дете3 || ---------- | ------ | ---------------- | ---- | -------------- | ---- | -------------- | ---- | -------------- || emp-A | съпруг | 1970-01-01 | дете1 | 1971-01-02 | дете2 | 1972-01-01 | дете3 | 1973-01-01 || emp-B | съпруг | 1980-02-01 | дете1 | 1981-02-01 | дете2 | 1982-02-01 | | || emp-C | | | дете1 | 1991-03-01 | дете2 | 1992-03-01 | | |

Преглед на DB Fiddle




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. php mysql показва резултатите като падащ списък

  2. Проектиране на нормализирана база данни за получаване на 5 най-близки съседи с помощта на MySQL пространствен индекс

  3. Максимална дължина за текст от типа MySQL

  4. Възможно ли е да се изпълни заявка за всяка база данни в mysql бази данни и да се сумират или комбинират резултати, като се използва само командна среда на mysql?

  5. Как да намеря всички низове с главни букви в MySQL таблица?