mysql - 在 MySQL 中创建涉及三个表的报告

标签 mysql sql aggregate reporting

简而言之,我希望创建一份报告,在下方(行)显示客户列表,在顶部(列)显示我们的服务。在每个单元格中,都会有一个数字,代表一种“对话类型”。这个想法是让我们的销售人员能够看到——如果客户知道我们提供的特定服务,他们是否接受它,他们是否尝试过但讨厌它,等等(这些是对话类型).这是为了避免一遍又一遍地用相同的信息轰炸客户。从本质上讲,它是销售团队可以用来在内部保持一致的工具。

这是我的表格:

服务(ID、服务名称、描述) 客户(id,client_name) 对话(id、client_id、service_id、conversation_type_id) conversation_type (id, description)

到目前为止,这是我的查询:

SELECT 
company,
CASE WHEN service_name= 'A' THEN conversation_type_id END AS 'A', 
CASE WHEN service_name= 'B' THEN conversation_type_id END AS 'B',
CASE WHEN service_name= 'C' THEN conversation_type_id END AS 'C',
CASE WHEN service_name= 'D' THEN conversation_type_id END AS 'D' 
FROM 
services srv
INNER JOIN 
conversations con ON srv.id=con.service_id
INNER JOIN company cmp ON con.client_id=cmp.id
INNER JOIN conversation_type typ ON con.conversation_type_id=typ.id
GROUP BY company;

看起来很接近,但不是打印

----------------------------------------------
|          | A      | B      | C      | D     |
|client 1  | 1      | 2      | 1      | 5     |
|client 2  | 3      | 2      | 3      | 4     |
|client 3  | 1      | 5      | 1      | 1     |
-----------------------------------------------

它改为打印

----------------------------------------------
|          | A      | B      | C      | D     |
|client 1  | 1      |        |        |       |
|client 1  |        | 2      |        |       |
|client 1  |        |        | 1      |       |
|client 1  |        |        |        |   5   |
-----------------------------------------------

我猜是分组的问题,但是我试了各种办法,好像都不尽如人意。有任何想法吗?真的,有更好的方法吗?真的很感激任何见解。谢谢。

最佳答案

您可以像 Strawberry 所说的那样,为每个案例放置 Max(case ...)。或者您可以通过将每个案例放入查询中然后加入它们来实现,就像这样(第一个肯定更好):

SELECT Z.Company, A,B,C,D 
FROM 
(SELECT 
company,
CASE WHEN service_name= 'A' THEN conversation_type_id END AS 'A'
FROM 
services srv
INNER JOIN 
conversations con ON srv.id=con.service_id
INNER JOIN company cmp ON con.client_id=cmp.id
INNER JOIN conversation_type typ ON con.conversation_type_id=typ.id
GROUP BY company) Z,
(SELECT 
company,
CASE WHEN service_name= 'B' THEN conversation_type_id END AS 'B'
FROM 
services srv
INNER JOIN 
conversations con ON srv.id=con.service_id
INNER JOIN company cmp ON con.client_id=cmp.id
INNER JOIN conversation_type typ ON con.conversation_type_id=typ.id
GROUP BY company) Y,
(SELECT 
company,
CASE WHEN service_name= 'C' THEN conversation_type_id END AS 'C'
FROM 
services srv
INNER JOIN 
conversations con ON srv.id=con.service_id
INNER JOIN company cmp ON con.client_id=cmp.id
INNER JOIN conversation_type typ ON con.conversation_type_id=typ.id
GROUP BY company) X,
(SELECT 
company,
CASE WHEN service_name= 'D' THEN conversation_type_id END AS 'D' 
FROM 
services srv
INNER JOIN 
conversations con ON srv.id=con.service_id
INNER JOIN company cmp ON con.client_id=cmp.id
INNER JOIN conversation_type typ ON con.conversation_type_id=typ.id
GROUP BY company) W
WHERE Z.company=Y.company
  AND Z.company=X.company
  AND Z.company=W.company

关于mysql - 在 MySQL 中创建涉及三个表的报告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37105520/

相关文章:

r - R中的Aggregate()示例

Mongodb 聚合在一个查询中需要帮助

mysql - 从交易表中为用户批量获取旧的贷方和借方账户余额

php - 在表单中输入值并使用 codeigniter 插入数据库后获取总值

mysql - 与服务器中运行的 C/C++ 程序相比,MySQL 的速度有多快?

php - 具有多个连接的 MySQL 连接查询

mysql - 如何在 Yii2 中进行批量数据库插入?

mysql - 在Mysql中我怎样才能找到点表的范围?

mysql - 选择除 minimum 之外的所有重复记录

mysql - 从字段插入中减去