2015-09-09 2 views
1

у меня есть большой набор данных, который содержит одну строку на человека, и 25 критериев столбцов, которые могут или не могут быть заполнены, как этот образец:MySQL Преобразование варьируя столбцов в строках

SELECT * FROM Criteria_Input; 

╔══════════╦═══════════╦═══════════╦═══════════╦═══════════╦═══════════╦═══════════╗ 
║ Name  ║ Criteria1 ║ Criteria2 ║ Criteria3 ║ Criteria4 ║ Criteria5 ║ Criteria6 ║ 
╠══════════╬═══════════╬═══════════╬═══════════╬═══════════╬═══════════╬═══════════╣ 
║ Michael ║   ║ Yes ║   ║   ║ Yes ║   ║ 
║ Brant ║   ║   ║   ║   ║   ║ Yes ║ 
║ Mary  ║ Yes ║   ║   ║ Yes ║   ║   ║ 
║ John  ║   ║   ║   ║   ║ Yes ║   ║ 
║ Connie ║   ║   ║ Yes ║ Yes ║   ║   ║ 
╚══════════╩═══════════╩═══════════╩═══════════╩═══════════╩═══════════╩═══════════╝ 

Мне нужно преобразовать эти данные в строки, как это:

SELECT * FROM Criteria_Final; 

╔═════════╦═══════════╗ 
║ Name ║ Criteria ║ 
╠═════════╬═══════════╣ 
║ Michael ║ Criteria2 ║ 
║ Michael ║ Criteria5 ║ 
║ Brant ║ Criteria6 ║ 
║ Mary ║ Criteria1 ║ 
║ Mary ║ Criteria4 ║ 
║ John ║ Criteria5 ║ 
║ Connie ║ Criteria3 ║ 
║ Connie ║ Criteria4 ║ 
╚═════════╩═══════════╝ 

или даже лучше, что-то это:

SELECT * FROM Criteria_Final; 

╔═════════╦══════════╗ 
║ Name ║ Criteria ║ 
╠═════════╬══════════╣ 
║ Michael ║  2 ║ 
║ Michael ║  5 ║ 
║ Brant ║  6 ║ 
║ Mary ║  1 ║ 
║ Mary ║  4 ║ 
║ John ║  5 ║ 
║ Connie ║  3 ║ 
║ Connie ║  4 ║ 
╚═════════╩══════════╝ 

Является ли этот вид о f преобразование данных возможно в MySQL? Причина, по которой мне нужно сделать такое преобразование, заключается в том, что я присоединяюсь к полученной таблице с другой таблицей по числу критериев.

+0

Этот вопрос может помочь, но он немного отличается. http://stackoverflow.com/questions/20797916/how-do-i-transfer-a-list-of-genres-in-sql-to-a-seperate-database –

ответ

3

Попробуйте запрос с союзами -

SELECT * FROM (
    SELECT name, 1 AS criteria FROM cr WHERE LENGTH(Criteria1) > 0 
    UNION 
    SELECT name, 2 AS criteria FROM cr WHERE LENGTH(Criteria2) > 0 
    UNION 
    SELECT name, 3 AS criteria FROM cr WHERE LENGTH(Criteria3) > 0 
    UNION 
    SELECT name, 4 AS criteria FROM cr WHERE LENGTH(Criteria4) > 0 
    UNION 
    SELECT name, 5 AS criteria FROM cr WHERE LENGTH(Criteria5) > 0 
    UNION 
    SELECT name, 6 AS criteria FROM cr WHERE LENGTH(Criteria6) > 0 
) t 
ORDER BY name, criteria 

Изменение WHERE условие для проверки NULL значения, если это необходимо.

+0

Спасибо @Devart, большое время; это изящное решение, и мне это нравится! Я поставил свой последний рабочий код ниже. –

+0

@Silly Goof Добро пожаловать) – Devart

1

Вот мое решение, основанное на прекрасном решении от @Devart. Во-первых, создание таблицы ввода:

CREATE TABLE Criteria_Input (
    Name VARCHAR(10), 
    Criteria1 VARCHAR(5), 
    Criteria2 VARCHAR(5), 
    Criteria3 VARCHAR(5), 
    Criteria4 VARCHAR(5), 
    Criteria5 VARCHAR(5), 
    Criteria6 VARCHAR(5), 
    Criteria7 VARCHAR(5), 
    Criteria8 VARCHAR(5) 
); 

Далее, создание финального стола:

CREATE TABLE Criteria_Final (
    Name VARCHAR(10), 
    Criteria INT(2) 
); 

Затем вставка данных образца:

INSERT INTO Criteria_Input 
    (`Name`, `Criteria1`, `Criteria2`, `Criteria3`, `Criteria4`, `Criteria5`, `Criteria6`) 
VALUES 
    ('"Michael"', NULL, '"Yes"', NULL, NULL, '"Yes"', NULL), 
    ('"Brant"', NULL, NULL, NULL, NULL, NULL, '"Yes"'), 
    ('"Mary"', '"Yes"', NULL, NULL, '"Yes"', NULL, NULL), 
    ('"John"', NULL, NULL, NULL, NULL, '"Yes"', NULL), 
    ('"Connie"', NULL, NULL, '"Yes"', '"Yes"', NULL, NULL) 
; 

И, наконец, код, который преобразует данные:

INSERT INTO Criteria_Final 
SELECT * FROM (
    SELECT name, 1 AS Criteria FROM Criteria_Input WHERE Criteria1 IS NOT NULL 
    UNION 
    SELECT name, 2 AS Criteria FROM Criteria_Input WHERE Criteria2 IS NOT NULL 
    UNION 
    SELECT name, 3 AS Criteria FROM Criteria_Input WHERE Criteria3 IS NOT NULL 
    UNION 
    SELECT name, 4 AS Criteria FROM Criteria_Input WHERE Criteria4 IS NOT NULL 
    UNION 
    SELECT name, 5 AS Criteria FROM Criteria_Input WHERE Criteria5 IS NOT NULL 
    UNION 
    SELECT name, 6 AS Criteria FROM Criteria_Input WHERE Criteria6 IS NOT NULL 
) Criteria_Input 
ORDER BY Name, Criteria; 

Вы можете видеть это в работе на SQL Fiddle.

Смежные вопросы