繁体   English   中英

从 3 个表中获取值到汇总表中 SQL

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM