SQL: объединение 3 таблиц с суммами, фильтрация по неагрегированным столбцам - PullRequest
3 голосов
/ 23 февраля 2012

У меня есть следующие таблицы:

    Plant:
ID      Name
1       Plant1
2       Plant2
......

   Rejects:
PlantID Quantity  Date
1       20        01/02/2012
1       3         02/02/2012
2       30        03/02/2012
.....

  Parts
PlantID Quantity  Date
1       300       01/02/2012
2       500       01/02/2012
1       600       02/02/2012
.......

Я пытаюсь объединить эти три, чтобы у меня была сумма частей и отклонений на завод между двумя датами:

Plant   Parts   Rejects
Plant1       900     23
Plant2       500     30
.....

Я пробовал соединения, которые просто умножают суммы, и я пробовал подзапросы, которые не позволяют использовать фильтр даты, потому что он не используется в предложении group by.

Кто-нибудь может помочь?

Ответы [ 3 ]

1 голос
/ 23 февраля 2012
declare @startDate datetime, @endDate datetime
select @startDate = '1/1/2012', @endDate = '2/1/2012'

select
    p.Name as Plant,

    (select sum(Quantity) 
     from Parts 
     where PlantID = p.ID and date between @startDate and @endDate) as Parts,

    (select sum(Quantity) 
     from Rejects 
     where PlantID = p.ID and date between @startDate and @endDate) as Rejects
from
    Plant p
where
    p.endDate is null
0 голосов
/ 23 февраля 2012

Следующее должно работать (с использованием оракула):

SELECT NVL(p.plantid, r.plantid), NVL(parts,0), NVL(rejects,0)
FROM 
    (SELECT plantid, sum(quantity) as parts
    FROM parts
    WHERE date BETWEEN a AND b) p
        FULL JOIN
    (SELECT plantid, sum(quantity) as rejects
    FROM rejects
    WHERE date BETWEEN a and b) r
       ON p.plantid = r.plantid

Обратите внимание, что это не приведет к растениям без брака или частей.

0 голосов
/ 23 февраля 2012

Это поможет:

select p.Name as Plant,
       SUM(t.Quantity) as Parts,
       SUM(r.Quantity) as Rejects
from Plant p
inner join Rejects r on p.ID = r.PlantID
inner join Parts t on p.ID = PlantID
group by p.Name


Вы делаете INNER JOIN между всеми таблицами, используя ID.После этого вам просто нужно SUM из Quantities в Parts и Rejects.Для этого вам нужно использовать GROUP BY.

...