我正在尝试生成一个有效地包含数据透视表的报表。除了编写一些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 | | | |
对于帖子的大小感到抱歉,我只是想清楚说明我正在使用哪些表格。
任何帮助都将不胜感激。
答案 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
这样的关键列。但是所提到的具有给定表格内容的输出表明这不会给出预期结果。也许它只是预期内容演示中的一个错误。