Mysql查询将表格从长格式转换为宽格式

时间:2013-08-01 16:02:53

标签: mysql

我有一个名为ContactAttrbiutes的表,其中包含每个联系人属性的列表。为这些联系人存储的数据类型包括:标题,姓名,姓氏电话号码等。

当前表格

+-------------+-----------+------------------------------+
| attributeId | ContactId | AttributeValue               |
+-------------+-----------+------------------------------+
|           1 |         5 | Lady                         |
|           2 |         5 | Elizabeth                    |
|           3 |         5 | E                            |
|           4 |         5 | Anson                        |
|           5 |         5 |                              |
|           6 |         5 |                              |
|           7 |         5 |                              |
|           8 |         5 |                              |
|          10 |         5 | 0207 72776                   |
|          11 |         5 |                              |
|          12 |         5 | 0207 22996                   |
|          13 |         5 | 0207 72761                   |
|          14 |         5 |                              |
|          15 |         5 |                              |
|          60 |         5 | Lloyds                       |
|          61 |         5 |                              |
|           1 |        10 | Mr                           |
|           2 |        10 | John                         |
|           3 |        10 | J C                          |
|           4 |        10 | Beveridge                    |
|           5 |        10 | Esq QC                       |
|           6 |        10 | Retired                      |
|           7 |        10 |                              |
|           8 |        10 |                              |
|          10 |        10 | 0207 930                     |
|          11 |        10 |                              |
|          12 |        10 |                              |
|          13 |        10 | 0207 930                     |
|          14 |        10 |                              |
|          15 |        10 |                              |
|          60 |        10 |                              |
|          61 |        10 |                              |
+-------------+-----------+------------------------------+

但是我想运行一个查询来创建一个看起来像......的表

新表

+-----------+----------------------+-------------------------+-----------------------+------------------------+
| ContactId | AttributeValue_Title | AttributeValue_ForeName |AttributeValue_Initial | AttributeValue_Surname |
+-----------+----------------------+-------------------------+-----------------------+------------------------+
| 5         | Lady                 | Elizabeth               | E                     |  Anson                 |
+-----------+----------------------+-------------------------+-----------------------+------------------------+
| 10        | Mr                   | John                    | J C                   | Beveridge              |
+-----------+----------------------+-------------------------+-----------------------+------------------------+

我确信有一个非常简单的答案,但我花了好几个小时看。有人可以帮忙吗?

以上只是我桌子的一小部分,我有750,000个联系人。另外我希望最终表格的列数比我上面描述的多,但它们将来自现有表格的不同属性。

非常感谢你。

2 个答案:

答案 0 :(得分:5)

试试这个

    SELECT ContactId , 
 max(CASE when attributeId = 1 then AttributeValue end) as AttributeValue_Title ,
 max(CASE when attributeId = 2 then AttributeValue end )as AttributeValue_ForeName ,
 max(CASE when attributeId = 3 then AttributeValue end )as AttributeValue_Initial ,
 max(CASE when attributeId = 4 then AttributeValue end) as AttributeValue_Surname  
 from Table1 
 group by ContactId

DEMO HERE

  • 如果您想让其他attributeId的结果更长,那么只需在代码中添加案例陈述。

答案 1 :(得分:1)

SELECT
    t_title.AttributeValue AS title,
    t_name.AttributeValue AS name,
    ...
FROM the_table AS t_title
JOIN the_table AS t_firstname USING(contact_id)
JOIN ...
WHERE
    t_title.attributeId = 1 AND
    t_firstname.attributeId = 2 AND
    ...
在大多数情况下,

EAV "model" is an antipattern。你真的会拥有可变数量的属性吗?如果是,那么无SQL解决方案可能比关系数据库更合适。