[英]Get values from 3 tables into a summarized table SQL
我尝试了在这里找到的其他解决方案,但没有得到正确的信息。
我有一个包含许多不同记录的表。 状态为活动的名称列表。 然后我有另一个表,其中包含每个名称的信息和票号,然后是分配“已分配”和“反馈”。 并非所有名字都有票。
然后还有 1 个表,其中包含用于该票号的小时数。
我想要每个名称的此信息摘要,无论那里是否有信息。 所以我从这里的子查询开始。
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.status = 50表示Assigned,20表示Feedback。 这些连接创建了一个如下所示的表:
---------------------------------------------------------------------------------------------------
| 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 |
----------------------------
现在,Hours 表是 c.value,这是一个 1 对 1 的关系,从 hours 表 1 到 many 关系中减去 sum(hours)。
如果我取出其中一个连接,该表就可以工作。 当我像这样将它们放在一起时,数字不正确。 如果我只使用那个连接,我可以获得正确的分配。 如果我只使用反馈连接,我可以获得正确的反馈号码。 然而,当试图从他们那里得到任何一个时,它不起作用。 如果您需要更多信息,请告诉我,我会尽力提供。
示例结果:
----------------------------
| 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 服务器,但 MySQL 中的逻辑对于这个简单示例是相同的) http://sqlfiddle.com/#!18/f77e4/5/0
output 匹配所需的结果,但问题可能出在另一个表上。 这假定一个表,但逻辑应该使用左连接工作相同
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.