使用GROUP_CONCAT进行PIVOT的问题

时间:2012-03-12 20:31:42

标签: mysql pivot-table

关注this article,我已经能够部分转置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');

现在我需要得到patientslymphoid病态影响的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)。但问题是当我为同一患者提供两个数据时。例如,让我们为患者2添加test密钥和新测试(所有先前的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 个答案:

答案 0 :(得分:1)

只需将测试添加到您的分组 -

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