使用合并行值创建视图

时间:2014-11-11 19:38:42

标签: mysql

如果主题不太清楚,请抱歉。这是我的sqlfiddle示例的链接 http://sqlfiddle.com/#!2/6806fa

我试图让role_list视图每个商店只包含1行。基本上,role_list应包含的是主要销售人员,代理人和经理员工。因此,从示例sql查询中我可以看到,我只是从role_list中选择所有行,它为每个A-Mart员工类型分别有一行(主要销售人员为一行,代理人为一行,经理人为一行) 。相反,我希望它只为A-Mart返回1行,每个职位的employee_id为100。

具体来说,我试图获得的结果输出是:

store_id   store_name   salesperson   agent   manager
----------|------------|-------------|-------|----------
1         |A-Mart      |100          |100    |100
2         |B-Mart      |102          |       |
3         |C-Mart      |103          |       |102

但相反,我得到了:

store_id   store_name   salesperson   agent   manager
----------|------------|-------------|-------|----------
1         |A-Mart      |100          |       |
1         |A-Mart      |             |100    |
1         |A-Mart      |             |       |100
2         |B-Mart      |102          |       |
3         |C-Mart      |             |       |102
3         |C-Mart      |103          |       |

我也试图坚持只使用连接而不是单独的子查询选择语句。

1 个答案:

答案 0 :(得分:1)

您正在尝试进行PIVOT,可以使用mysql中的CASEMAXGROUP BY来实现。

SELECT
  s.store_id,
  s.store_name,
  MAX(CASE WHEN r.role_char ='S' THEN emp.employee_id ELSE '' END )AS salesperson,
  MAX(CASE WHEN r.role_char ='A' THEN emp.employee_id ELSE '' END ) AS agent,
  MAX(CASE WHEN r.role_char ='M' THEN emp.employee_id ELSE '' END ) AS manager
FROM
  store s
  LEFT JOIN store_role sr ON sr.store_id=s.store_id AND sr.primary_f=1
  LEFT JOIN role r ON sr.role_id=r.role_id AND sr.store_id=r.store_id
  LEFT JOIN employee emp ON emp.employee_id = sr.employee_id 
GROUP BY s.store_id, s.store_name