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中为其制作一个示例