【问题标题】:Creating a report in MySQL involving three tables在 MySQL 中创建涉及三个表的报告
【发布时间】:2016-05-08 22:29:18
【问题描述】:

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

这是我的桌子:

服务(id、service_name、描述) 客户(id,client_name) 对话(id、client_id、service_id、conversation_type_id) 对话类型(id,描述)

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

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   |
-----------------------------------------------

我想这是一个分组问题,但我尝试了各种方法,但似乎并不令人满意。有任何想法吗?真的,有没有更好的方法来做到这一点?真的很感激任何见解。谢谢。

【问题讨论】:

  • 那将是(例如)MAX(CASE WHEN...END) 'A' 等。至于更好的方法,是的。数据显示问题通常最好在表示层/应用程序级代码中处理,假设它是可用的(例如,在格式良好的数组上的简单 PHP 循环)
  • 如果您可以在 FROM 表中显示实际数据的示例会有所帮助
  • 谢谢草莓!我不明白为什么这有效,但它有效!你能推荐一篇我能读到的关于 MAX(CASE WHEN...END) 的文章吗?我真的需要更好地理解如何构建报告和使用聚合函数,在这一点上我是一个新手。你似乎知道你在说什么,所以任何推荐的阅读我都会非常感激!

标签: mysql sql aggregate reporting


【解决方案1】:

您可以像草莓所说的那样通过为每个案例放置 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

【讨论】:

  • 呸。认为我会坚持 A 计划
  • 感谢您的详细说明!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多