2015-06-16 2 views
1

У меня есть 5 таблиц, которыеодин SQL запрос, чтобы получить количество элементов из разных таблиц ссылки в другой таблице

- Project(PK Project_ID), 
- Bottles (PK Bottle_ID, FK Project_ID), 
- Plastics (PK Plastic_ID, FK Project_ID), 
- Glasses (PK Glass_ID,FK Project_ID) and 
- Cups (PK Cup_ID, FK Project_ID) 

Как я могу получить один SQL запрос, чтобы вернуть количество бутылок, пластмассы, стекла и Кубок за проект, где в одном проекте много бутылок, пластмасс, очков и чашек?

+0

Я использую MS SQL 2008. – Loic

ответ

3
select p.project_id, count(distinct bottle_id), count(distinct plastic_id), count(distinct glass_id), count(distinct cup_id) 
from project p 
left join bottles b on p.project_id = b.project_id 
left join plastics pl on p.project_id = pl.project_id 
left join glasses g on p.project_id = g.project_id 
left join cups c on p.project_id = c.project_id 
group by p.project_id 
1
SELECT P.Project_ID, COUNT(B.BOTTLE_ID) AS BOTTLECOUNT, 
COUNT(L.PLASTIC_ID) AS PLASTICCOUNT, 
COUNT(G.GLASSES_ID) AS GLASSCOUNT, 
COUNT(C.CUP_ID) AS CUPCOUNT 
FROM PROJECT AS P 
INNER JOIN BOTTLES B 
ON P.PROJECT_ID=B.PROJECT_ID 
INNER JOIN PLASTIC L 
ON P.PROJECT_ID=L.PROJECT_ID 
INNER JOIN GLASSES G 
ON P.PROJECT_ID = G.PROJECT_ID 
INNER JOIN CUPS C 
ON P.PROJECT_ID=C.PROJECT_ID 
GROUP BY P.PROJECT_ID, BOTTLE_ID, PLASTIC_ID, GLASSES_ID, CUP_ID 
ORDER BY PROJECT_ID 
+1

Если есть совпадения в ' BOTTLES', но None в таблице «PLASTIC», 'INNER JOIN' приведет к тому, что результирующий набор будет пустым. Правильно? – slartidan

+0

Он не должен, он должен возвращать счет 0. Установлен ли столбец для принятия нулевых значений? – alybaba726

1

ли вы имеете в виду вы хотите отображать уникальный идентификатор проекта, который, по крайней мере,> = 1 бутылка,> = 1 Пластик,> = 1 Glass,> = 1 один Кубок? Если так что вы могли бы написать запрос, как это, который соединяет все таблицы на основе FK (ProjectID) и группу по ProjectID:

SELECT p.ProjectID 
    ,COUNT(DISTINCT (b.Bottle_ID)) 'CountBottles' 
    ,COUNT(DISTINCT (p.Plastic_ID)) 'CountPlastic' 
    ,COUNT(DISTINCT (g.Glass_ID)) 'CountGlass' 
    ,COUNT(DISTINCT (c.Cup_ID)) 'CountCup' 
FROM Project p 
INNER JOIN Bottles b ON p.projectID = b.projectID 
INNER JOIN Plastics pl ON pl.projectID = p.projectID 
INNER JOIN Glasses g ON g.projectID = p.projectID 
INNER JOIN Cups c ON c.projectID = p.projectID 
GROUP BY p.ProjectID 
+0

Спасибо за ответ. – Loic

2
Create table Project (Project_ID int) 
Create table Bottles (Bottle_ID int, Project_ID int) 
Create table Plastics (Plastics_ID int, Project_ID int) 
Create table Glasses (Glasses_ID int, Project_ID int) 
Create table Cups (Cups_ID int, Project_ID int) 

insert into Project (Project_ID) values (1) 
insert into Bottles (Bottle_ID,Project_ID) values (1,1) 
insert into Bottles (Bottle_ID,Project_ID) values (2,1) 
insert into Bottles (Bottle_ID,Project_ID) values (3,1) 
insert into Plastics (Plastics_ID,Project_ID) values (1,1) 
insert into Plastics (Plastics_ID,Project_ID) values (2,1) 
insert into Glasses (Glasses_ID,Project_ID) values (1,1) 
insert into Glasses (Glasses_ID,Project_ID) values (2,1) 
insert into Cups (Cups_ID,Project_ID) values (1,1) 
insert into Cups (Cups_ID,Project_ID) values (2,1) 

select distinct p.Project_ID, 
(select COUNT(*) from Bottles where p.Project_ID=Project_ID) Bottles , 
(select COUNT(*) from Plastics where p.Project_ID=Project_ID) Plastics , 
(select COUNT(*) from Glasses where p.Project_ID=Project_ID) Glasses , 
(select COUNT(*) from Cups where p.Project_ID=Project_ID) Cups 
from Project p 
+0

Попробуйте добавить еще один проект с бутылками, это даст неправильные результаты, так как ваш подзапрос не проверяет правильность project_id – Aquillo

+1

Извините, так оно и будет: выберите отдельный p.Project_ID, (выберите COUNT (*) из Bottles, где p.Project_ID = Project_ID) Бутылки, (выберите COUNT (*) из Plastics, где p.Project_ID = Project_ID) Пластмассы, (выберите COUNT (*) из очков, где p.Project_ID = Project_ID) Очки, (выберите COUNT (*) из чашек, где p.Project_ID = Project_ID) Кубки от проекта p – Premks

+0

Спасибо за ответ и пример. Очень полезно. – Loic