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