Проблемы PIVOT с использованием GROUP_CONCAT - PullRequest
0 голосов
/ 13 марта 2012

После этой статьи я смог частично перенести таблицу mySQL. Это таблица:

CREATE TABLE  `test`.`treat` (
`patient` INT NOT NULL ,
`pathology` VARCHAR( 15 ) NOT NULL ,
`present` VARCHAR( 15 ) NOT NULL
) ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_unicode_ci;

затем введите некоторые данные:

INSERT INTO `test`.`treat` (`patient`, `pathology`, `present`) 
VALUES ('1', 'myeloid', 'yes'), ('2', 'lymphoid', 'yes'), ('2', 'myeloid', 'no'), ('3', 'myeloid', 'no'), ('4', 'lymphoid', 'yes');

и теперь мне нужно узнать, на что patients влияют патологии lymphoid или myeloid:

SELECT patient,
  GROUP_CONCAT(if(pathology='myeloid', present, NULL)) AS 'myeloid',
  GROUP_CONCAT(if(pathology='lymphoid', present, NULL)) AS 'lymphoid'
FROM treat
GROUP BY patient

Я получаю такую ​​таблицу, которая показывает, когда пациент перенес одну из этих патологий, или NULL, если нет доступной информации:

patient  myeloid  lymphoid
1        yes      NULL
2        no       yes
3        no       NULL
4        NULL     yes

Эти данные соответствуют периодическим испытаниям. Я упустил параметр test для простоты (test INT NOT NULL). Но проблема в том, что у меня есть два данных для одного и того же пациента. Например, давайте добавим клавишу test и новый тест для пациента 2 (все предыдущие значения test соответствуют тесту 1):

INSERT INTO `test`.`treat` (`patient`, `pathology`, `present`, `test`) 
VALUES ('2', 'myeloid', 'yes', '2');

Если мы запустим запрос, мы получим следующую таблицу:

patient  myeloid  lymphoid
1        yes      NULL
2        no,yes   yes
3        no       NULL
4        NULL     yes

Пациент № 2 имеет строку myeloid, которая создается * GROUP_CONCAT * с двумя значениями, разделенными запятыми. Мне нужно иметь строку для каждого значения, например:

patient  myeloid  lymphoid
1        yes      NULL
2        no       yes
2        yes      NULL
3        no       NULL
4        NULL     yes

Что нужно сделать, чтобы учесть номер теста?

1 Ответ

1 голос
/ 13 марта 2012

Просто добавьте тест в вашу группу -

SELECT
    patient,
    GROUP_CONCAT(IF(pathology='myeloid', present, NULL)) AS 'myeloid',
    GROUP_CONCAT(IF(pathology='lymphoid', present, NULL)) AS 'lymphoid'
FROM treat
GROUP BY patient, test
...