2015-11-09 2 views
3

Я хочу подсчитать количество разных овец, и я хочу его в одном столе.Использование COUNT с несколькими таблицами

Нравится это;

Ewes | Rams | Lambs 
8 | 5 | 12 

Запрос, который я пробую, это, но он не работает;

SELECT COUNT(e.EweID) AS 'Ewe', COUNT(r.RamID) AS 'Ram', COUNT(l.LambID) AS 'Lamb' 
FROM Sheep s 
    INNER JOIN Ewe e ON s.SheepID = e.EweID 
    INNER JOIN Ram r ON s.SheepID = r.RamID 
    INNER JOIN Lamb l ON s.SheepID = l.LambID 
WHERE s.FarmerID = '123' 

Я не понимаю, что я делаю неправильно, это моя база данных ERD;

s

+1

Не могли бы вы помочь нам и сообщить нам, что именно работает неправильно? –

+0

Я бы пошел с LEFT JOIN здесь. – jarlh

+0

Попробуйте LEFT OUTER JOINs. –

ответ

3

Я не думаю, что вам нужно FROM здесь все:.

select 
    (select count(*) from Ram where Famerid = 123) as RamCount, 
    (select count(*) from Ewe where Famerid = 123) as Count, 
    (select count(*) from Lamb where Famerid = 123) as LambCount 

(Там нет никакой связи между рядами вы подсчета, не не пытаться создать Вместо подсчитывать каждый отдельно, упаковка все это в наружном выборе держит все в одном ряду результата)

+0

Как просто! Теперь я чувствую себя полным идиотом. –

1

Я думаю, что проблема здесь заключается в том, что вам не нужен INNER JOIN но OUTER JOIN ...

SELECT COUNT(CASE WHEN e.EweID IN NOT NULL THEN e.EweID ELSE 0 END) AS 'Ewe', COUNT(r.RamID) AS 'Ram', COUNT(l.LambID) AS 'Lamb' 
FROM Sheep s 
    LEFT OUTER JOIN Ewe e ON s.SheepID = e.EweID 
    LEFT OUTER JOIN Ram r ON s.SheepID = r.RamID 
    LEFT OUTER JOIN Lamb l ON s.SheepID = l.LambID 
WHERE s.FarmerID = '123' 

Посмотрите, даже в случае утверждения, что я» ve добавлено внутри первого счета (Ewe), чтобы увидеть способ обработки нулей в счете.

Левый внешнее соединение логический оператор возвращает каждую строку, которая удовлетворяет объединением первого (верхнего) входа со вторым (нижним) входом. Он также возвращает любые строки из первого ввода, у которого не было соответствующих строк во втором вводе. Непосредственные строки во втором вводе: , возвращенные как нулевые значения. Если в столбце Аргумент не существует предиката соединения, каждая строка является совпадающей строкой.

0

использование коррелирует суб-выбирает сделать отсчет:.

SELECT (select COUNT(*) from Ewe e where s.SheepID = e.EweID) AS 'Ewe', 
     (select COUNT(*) from Ram r where s.SheepID = r.RamID) AS 'Ram', 
     (select COUNT(*) from Lamb l where s.SheepID = l.LambID) AS 'Lamb' 
FROM Sheep s 

WHERE s.FarmerID = '123' 

И вы также можете просто удалить пункт WHERE, чтобы получить все счета ферм.

0
DECLARE @Count1 INT; 

SELECT @Count1 = COUNT(*) 
FROM dbo.Ewe; 

DECLARE @Count2 INT; 

SELECT @Count2 = COUNT(*) 
FROM dbo.Ram; 

DECLARE @Count3 INT; 

SELECT @Count3 = COUNT(*) 
FROM dbo.Lamb; 

SELECT @Count1 AS 'Ewe' , 
     @Count2 AS 'Ram' , 
     @Count3 AS 'Lamb' 
Смежные вопросы