Mysql 将3个表中的值获取到汇总表SQL中

Mysql 将3个表中的值获取到汇总表SQL中,mysql,sql,Mysql,Sql,我已经尝试过我在这里找到的其他解决方案,但我没有得到正确的信息 我有一张有许多不同唱片的桌子。状态为“活动”的名称列表。然后,我有另一个表,其中包含每个姓名的信息,带有票证号,然后是“分配”和“反馈”。不是所有的名字都有票 然后,还有一个表,其中包含了通向该票号的小时数 我想要每个名字的信息摘要,无论那里是否有信息。所以我从一个子查询开始这里就是我所拥有的 select z.name as 'Name', round(coalesce(sum(x.Hours),0),2) as "As

我已经尝试过我在这里找到的其他解决方案,但我没有得到正确的信息

我有一张有许多不同唱片的桌子。状态为“活动”的名称列表。然后,我有另一个表,其中包含每个姓名的信息,带有票证号,然后是“分配”和“反馈”。不是所有的名字都有票

然后,还有一个表,其中包含了通向该票号的小时数

我想要每个名字的信息摘要,无论那里是否有信息。所以我从一个子查询开始这里就是我所拥有的

select z.name as 'Name', round(coalesce(sum(x.Hours),0),2) as "Assigned", 
round(coalesce(sum(y.Hours),0),2) as "Feedback" from 
        (select name from namelist where status = 'Active') as z 
    left join
       (select e.realname as "Name", b.id as "Ticket", b.status as "Status", c.value - 
       COALESCE(sum(a.Hours),0) as "Hours" from user_table e
       join ticket_table b ON b.handler_id = e.id
       join custom_table c ON c.bug_id = b.id AND c.field_id = 7 
       left custom_table d ON d.bug_id = b.id AND d.field_id = 15
       left hours_table a ON a.Ticket = b.id
       where (b.status = 50)
       Group By b.id  
       ORDER BY `Name` ASC, `Status` DESC) x on z.Name= x.Name
    left JOIN
       (select e.realname as "Name", b.id as "Ticket", b.status as "Status", c.value - 
       COALESCE(sum(a.Hours),0) as "Hours" from user_table e
       join ticket_table b ON b.handler_id = e.id
       join custom_table c ON c.bug_id = b.id AND c.field_id = 7 
       left custom_table d ON d.bug_id = b.id AND d.field_id = 15
       left hours_table a ON a.Ticket = b.id
       where (b.status = 20)
       Group By b.id  
       ORDER BY `Name` ASC, `Status` DESC) y on z.Name= y.Name

   Group by Name
我已经改变了一些名字,但这是基本的想法。b、 状态=50表示分配,20表示反馈。这些联接将创建一个如下所示的表:

---------------------------------------------------------------------------------------------------
| Name | Ticket | Status| Hours ((value from custom_table)-(sum from hours table based on ticket))|
| Joe  |  234   | 50    |  20                                                                     |
| Joe  |  235   | 50    |  30                                                                     |
| Joe  |  236   | 50    |  40                                                                     |
| John |  233   | 50    |  10                                                                     |
| John |  237   | 50    |  20                                                                     |
| John |  238   | 50    |  20                                                                     |
---------------------------------------------------------------------------------------------------

---------------------------------------------------------------------------------------------------
| Name | Ticket | Status| Hours ((value from custom_table)-(sum from hours table based on ticket))|
| Joe  |  134   | 20    |  60                                                                     |
| Joe  |  135   | 20    |  30                                                                     |
| Joe  |  136   | 20    |  40                                                                     |
| John |  133   | 20    |  70                                                                     |
| John |  137   | 20    |  20                                                                     |
| John |  138   | 20    |  20                                                                     |
---------------------------------------------------------------------------------------------------

-----------------
| Name | Status |
| Joe  |  Active| 
| John |  Active|
| Mary |  Active| 
| Tom  |  Active| 
| John |Inactive|
-----------------
预期结果:

----------------------------
| Name | Assigned| Feedback| 
| Joe  |  90     |   130   |  
| John |  50     |   110   | 
| Mary |  0      |    0    | 
| Tom  |  0      |    0    |
----------------------------
现在,小时表是c.value,它是从小时表1到多个关系的1:1关系减去总和(小时)

如果我去掉其中一个连接,表就会工作。当我这样把它们放在一起时,数字是不正确的。如果我只使用该联接,则可以获得正确的分配。如果我只使用feeback连接,我可以获得正确的反馈数字。然而,当试图从他们那里得到任何一个时,它都不起作用。让我知道如果你需要更多的信息,我会尽力提供

示例结果:

----------------------------
| Name | Assigned| Feedback| 
| Joe  |  392    |   145   |  
| John |  125    |   94    | 
| Mary |  0      |    0    | 
| Tom  |  0      |    0    |
----------------------------

If I just use the table with status 50.
----------------------------
| Name | Assigned|  
| Joe  |  90     |   
| John |  50     | 
| Mary |  0      | 
| Tom  |  0      |
----------------------------

If I just use the table with status 20.
----------------------------
| Name | Assigned|  
| Joe  |  130    |   
| John |  110    | 
| Mary |  0      | 
| Tom  |  0      |
----------------------------

不要太担心自定义表,它们存在是有原因的,但不是我问题的一部分。最大的事情就是从那里简单地获取c.value,该表的另一个连接仅用于另一个状态,但与我试图实现的目标无关。

除了状态之外,两个左连接对我来说似乎是相同的(除非我遗漏了什么)

您是否尝试过使用单个左连接,然后使用带有Case语句的聚合,即

SELECT Name, 
SUM(CASE WHEN Status = 50 THEN Hours ELSE 0 END) AS Assigned, 
SUM(CASE WHEN Status = 20 THEN Hours ELSE 0 END) AS Feedback 

FROM table 

GROUP BY Name 
我很感激这里的答案过于简化,但这更像是一个建议,因为我不知道查询中提到的所有表的内容

SQL FIDDLE示例(抱歉使用SQL SERVER,但MySQL中的逻辑与此简单示例相同)

输出与所需结果匹配,但问题可能在于另一个表。
这假设只有一个表,但使用左连接时逻辑应该是相同的

这是MySQL还是SQL Server?我相信它会通过siteground,所以MySQL。您好,谢谢您的回复。我确实试过了。但我在一列或另一列中得到一个值。因为反馈中有数据,所以我分配了一个0。因为不是小时数,所以我尝试求和小时数,所以如果我使用else 0,状态不为50的记录将该列作为0,而不是添加到总数中。您通常可以将MAX()与它结合使用,它将使列彼此相邻显示。我将尝试在SQL Fiddle中为其制作一个示例