从一个表中选择具有不同条件的列两次,并使用与另外两个表的连接

时间:2017-03-01 20:55:16

标签: sql inner-join

这次我会尝试正确地做到这一点

所以我有3个SQL表,生产,资源,资产,它们看起来像这样:

资产:

ID     Name
------------
1     Line1
2     Line2
3     Line3

资源:

ID   Asset_ID
------------
1      1
2      1
3      2
4      3
5      3

生产:

Resource_ID  Quantity    Type
------------------------------
1               5        Scrap
3               10       Scrap
1               6        Rework
3               3        Rework
1               15       Scrap

我想要的是达到这个结果:

Name   Scrap    Rework
-----------------------
Line1    20       6
Line2    10       3
Line3    0        0

基本上我需要抓住每个线路名称,然后在接下来的两列中显示总废料数量和总返工数量。现在我已经完成了它的一部分,我没有遇到我需要的Scrap或Rework当时需要的东西,我遇到的问题是当我想要将它们都放在不同列的一个表中时。 我现在正在使用以下内容:

SELECT a.ID, a.Name, d.Resource_ID, SUM(d.Quantity) [Scrap]
FROM Production d inner join SubResource r ON d.Resource_ID = s.ID 
inner join Asset a ON a.ID = r.Asset_ID
WHERE Type = 'Scrap' group by a.ID, a.Name, d.Resource_ID

这给了我:

Name   Scrap
------------
Line1    20
Line2    10
Line3    0 

我知道我需要在这里进行子查询(一个用于废弃,另一个用于返工)我尝试对其进行研究,但是让所有这些内部联接与子查询一起工作会让我感到困惑。 我尝试了一些,我不断得到所有线路的废料总数和返工总数,这显然是不正确的。 如果有人能指出我正确的方向,我会很感激。谢谢

1 个答案:

答案 0 :(得分:2)

pivot()的传统交叉表/条件聚合版本如下:

select
    a.id
  , a.Name
  , sum(case when [Type]='Scrap' then d.Quantity else 0 end) as [Scrap]
  , sum(case when [Type]='Rework' then d.Quantity else 0 end) as [Rework]
from Asset a 
  left join Resource r 
    on a.id = r.Asset_id
  left join Production d 
      on d.Resource_id = r.id 
     and d.[Type] in ('Scrap','Rework')
group by 
    a.id
  , a.Name

测试设置:http://rextester.com/LPMJB2638

返回:

+----+-------+-------+--------+
| id | Name  | Scrap | Rework |
+----+-------+-------+--------+
|  1 | Line1 |    20 |      6 |
|  2 | Line2 |    10 |      3 |
|  3 | Line3 |     0 |      0 |
+----+-------+-------+--------+