mysql - MySQL 查询可以将行转换为列吗?

标签 mysql

我有许多表,我正尝试将它们与联接结合起来,但因此,结果以多行的形式返回,而我希望将它们生成为新列。

成员(member)信息表

MemberID | FirstName | LastName 
---------------------------------
   1     |   John    |  Harris
   2     |   Sarah   |  Thompson
   3     |   Zack    |  Lewis

member_dependent_information 表

MemberID | FirstName | LastName | Type
---------------------------------------
   1     |   Amy     | Harris   |  1 
   2     |   Bryan   | Thompson |  1
   2     |   Dewey   | Thompson |  2
   2     |   Tom     | Thompson |  2
   3     |   Harry   | Lewis    |  2
   3     |   Minka   | Lewis    |  1

MySQL 查询:

SELECT
    t1.FirstName,
    t1.LastName,
    t1.MemberID,
    IF(t2.Type = '1',CONCAT(t2.FirstName,' ',t2.LastName),'') AS Spouse_Name,
    IF(t2.Type = '2',CONCAT(t2.FirstName,' ',t2.LastName),'') AS Child_Name,

FROM
    member_dependent_information t2
INNER JOIN
    member_information t1
USING
    (MemberID)
ORDER BY
    t1.LastName ASC,
    t1.MemberID ASC;

理想的结果

MemberID | FirstName | LastName  | Spouse_Name    | Child_Name1   | Child_Name2 
--------------------------------------------------------------------------------
   1     |   John    |  Harris   | Amy Harris     |     NULL       |   NULL    
   2     |   Sarah   |  Thompson | Bryan Thompson | Dewey Thompson | Tom Thompson    
   3     |   Zack    |  Lewis    | Mika Lewis     | Harry Lewis    |   NULL

实际结果

MemberID | FirstName | LastName  | Spouse_Name    | Child_Name 
-------------------------------------------------------------------
   1     |   John    |  Harris   | Amy Harris     |    NULL
   2     |   Sarah   |  Thompson | Bryan Thompson |    NULL  
   2     |   Sarah   |  Thompson |      NULL      | Dewey Thompson  
   2     |   Sarah   |  Thompson |      NULL      | Tom Thompson    
   3     |   Zack    |  Lewis    | Mika Lewis     |    NULL      
   3     |   Zack    |  Lewis    |      NULL      | Harry Lewis    

虽然我的查询在多行中返回了“正确”的数据,但它没有根据需要将结果合并到一行中。

关于数据透视表/交叉表的建议已在下面提到,但我能找到的每个引用资料都建议使用数学计算或要返回的字段数是已知的。我不会知道此信息,因为单个成员可能有多达 100 个家属(尽管更像是 4-8)

更新 #1

我觉得我离最终解决方案越来越近了。我将 GROUP_CONCAT 函数添加到我的查询中,它在单个列中返回所有名字,在单个列中返回所有姓氏,但仍需要将它们分解成各自的列。

新函数是:

SELECT
  t1.MemberID,
  t1.FirstName,
  t1.LastName,
  GROUP_CONCAT(t2.FirstName) AS Dep_Firstnames,
  GROUP_CONCAT(t2.LastName) AS Dep_LastNames
FROM
  member_information t1
  LEFT OUTER JOIN member_dependent_information t2
    ON t1.MemberID = t2.MemberID
WHERE
  t1.Status = 1
GROUP BY
  t1.MemberID

最佳答案

有时,解决问题的第一步是知道问题的名称。之后,这只是谷歌搜索的问题。您尝试创建的称为数据透视表交叉表报告。这是一个解释如何创建 pivot tables in MySQL 的链接.这是更深入的 tutorial .

更新:

现在您已经更新了问题,我对您要完成的任务有了更清晰的认识。我会根据 MySQL 的 GROUP_CONCAT 为您提供一个类似但完全您想要的替代解决方案。功能。

select t1.FirstName, t1.LastName, group_concat(concat(t2.FirstName, ' ', t2.LastName))
from member_information as t1
left outer join member_dependent_information as t2 on t2.MemberID=t1.MemberID
group by t1.MemberID;

我已按如下方式验证此查询。首先是设置:

create table member_information (
    MemberID int unsigned auto_increment primary key,
    FirstName varchar(32) not null,
    LastName varchar(32) not null
) engine=innodb;

create table member_dependent_information (
    MemberID int unsigned not null,
    FirstName varchar(32) not null,
    LastName varchar(32) not null,
    Type int unsigned not null,
    foreign key (MemberID) references member_information(MemberID)
) engine=innodb;

insert into member_information (MemberID, FirstName, LastName) values
(1, 'John', 'Harris'),
(2, 'Sarah', 'Thompson'),
(3, 'Zack', 'Lewis');

insert into member_dependent_information (MemberID, FirstName, LastName, `Type`) values
(1, 'Amy', 'Harris', 1),
(2, 'Bryan', 'Thompson', 1),
(2, 'Dewey', 'Thompson', 2),
(2, 'Tom', 'Thompson', 2),
(3, 'Harry', 'Lewis', 2),
(3, 'Minka', 'Lewis', 1);

现在是查询和结果:

mysql> select t1.FirstName, t1.LastName, group_concat(concat(t2.FirstName, ' ', t2.LastName))from member_information as t1
    -> left outer join member_dependent_information as t2 on t2.MemberID=t1.MemberID
    -> group by t1.MemberID;
+-----------+----------+------------------------------------------------------+
| FirstName | LastName | group_concat(concat(t2.FirstName, ' ', t2.LastName)) |
+-----------+----------+------------------------------------------------------+
| John      | Harris   | Amy Harris                                           | 
| Sarah     | Thompson | Bryan Thompson,Dewey Thompson,Tom Thompson           | 
| Zack      | Lewis    | Harry Lewis,Minka Lewis                              | 
+-----------+----------+------------------------------------------------------+
3 rows in set (0.00 sec)

关于mysql - MySQL 查询可以将行转换为列吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4336985/

相关文章:

mysql:如何使用存储过程的结果作为另一个存储过程中的表/ View

php - 如何统计查询结果中所有行出现的次数

MySQL 触发器与选择

php - PHP MYSQL数据库中SELECT重复列

mysql select 查询错误

mysql - 无法删除索引

mysql - 错误代码 : 1292 Truncated incorrect CHAR(8) value: '20160331000000'

mysql - 查询返回错误的输出

php - 如何检查php中的变量是否为空以及是否不需要在表中显示

mysql - 在触发器内声明变量