MySQL选择命令/数据透视表

时间:2015-06-19 13:22:01

标签: mysql sql join syntax

我正在尝试生成一个有效地包含数据透视表的报表。除了编写一些sql语句,并通过代码(Excel / VBA)和循环这么做之外,我似乎无法尝试构建一个包罗万象的SQL语句。

我列出了下面的示例表,以及我想在结尾处输出的示例。

基本上我需要找到哪个联系人在哪个组中,并显示总出现次数或真假是否在组中。

因此,对于组表中的所有组,列出所有联系人,并在contact_groups表中显示他们的指示(计数等)。

这是否可以通过单个语句实现,或者我可以更好地顺序运行记录。显然,这可能会产生大量的SQL调用。

Tables:

groups
-------------------
| key_id | group  |
-------------------
|  1     | group1 |
|  2     | group2 |
|  3     | group3 |
|  4     | group4 |
|  5     | group5 |

contacts                                          
------------------------------------------------  
| key_id | account_code | first_name | surname |  
------------------------------------------------  
|  1     | abc001       | John       | Smith   |  
|  2     | abc001       | Philip     | Doe     |  
|  3     | abc002       | Peter      | Thomas  |  

contact_groups
---------------------------------------------------
| key_id | contact_id | group_code | account_code |
---------------------------------------------------
|  1     | 1          | group1     | abc001       |
|  2     | 1          | group2     | abc001       |
|  3     | 2          | group1     | abc001       |
|  4     | 3          | group2     | abc002       |

Output Req'd
-----------------------------------------------------------------------
| name         | account | group1 | group2 | group3 | group4 | group5 | 
-----------------------------------------------------------------------
| John Smith   | abc001  | 1      | 1      |        |        |        |
| Philip Doe   | abc001  | 1      |        |        |        |        |
| Peter Thomas | abc002  |        | 1      |        |        |        |

对于帖子的大小感到抱歉,我只是想清楚说明我正在使用哪些表格。

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:1)

您可以使用它,例如:

SELECT c.firstname + ' ' c.surname, account
    if(g.group_code='group1',1,null) as group1,
    if(g.group_code='group2',1,null) as group2,
    if(g.group_code='group3',1,null) as group3,
    if(g.group_code='group4',1,null) as group4,
    if(g.group_code='group5',1,null) as group5
FROM groups g
INNER JOIN contact_groups cg
        ON g.group = cg.group -- not sure, would guess to use key_id but your example isn't clear that this should be use on this place
INNER JOIN contacts c
        ON c.contact_id = cg.contact_id
GROUP BY c.firstname, c.surname, c.account

正如代码中提到的那样,我不确定与g.group = cg.group的联接是否合适。我通常会尝试加入像key_id这样的关键列。但是所提到的具有给定表格内容的输出表明这不会给出预期结果。也许它只是预期内容演示中的一个错误。