Как использовать T-SQL Group By с несколькими таблицами? - PullRequest
0 голосов
/ 08 июля 2009

У меня есть таблица поставщиков и таблицы Компьютеры, Камеры, Отображает все, содержащие поле SupplierID.

Я пытаюсь сделать T-SQL, в котором будут перечислены все поставщики с подсчетом всех строк. Я могу сделать их по одному с:

SELECT SupplierID, COUNT(dbo.Computers.ComputerID) as Computers 
FROM Supplier INNER JOIN
    Computers ON Supplier.SupplierID = Computers.SupplierID
GROUP BY SupplierID

Как я могу изменить это, чтобы включить другие таблицы - например, камеры, дисплеи и т. Д ...

Ответы [ 4 ]

4 голосов
/ 08 июля 2009

Предполагая, что поставщики не могут поставлять каждый тип продукта, вы захотите использовать внешние соединения. Если вы используете внутренние соединения, вы вернете только тех поставщиков, которые поставят хотя бы по одной продукции. Вы также хотите посчитать отдельный ProductId для каждого типа продукта. В противном случае вы получите влияет мультипликация. (Например, Поставщик 1 предоставляет Компьютеры 1 и 2 и отображает 10 и 11, Вы получите четыре строки: Дисплей 10 компьютера 1, Дисплей 11 компьютера 1, Компьютер 4 и Дисплей 11.)

Опираясь на ответ ГБН:

SELECT
    Supplier.SupplierID,
    COUNT(distinct Computers.ComputerID) as Computers,
    COUNT(distinct Displays.DisplayID) as Displays,
    COUNT(distinct Foos.FooID) as Foos,
    COUNT(distinct Bars.BarID) as Bars
FROM Supplier
LEFT OUTER JOIN Computers 
    ON Supplier.SupplierID = Computers.SupplierID
LEFT OUTER JOIN Displays 
    ON Supplier.SupplierID = Displays.SupplierID
LEFT OUTER JOIN Foos 
    ON Supplier.SupplierID = Foos.SupplierID
LEFT OUTER JOIN Bars 
    ON Supplier.SupplierID = Bars.SupplierID
GROUP BY
    Supplier.SupplierID
4 голосов
/ 08 июля 2009

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

вещь, которую вы должны учитывать (и это отдельная схема), заключается в том, что вам может понадобиться left join таблиц. Если вы внутренне присоединитесь к ним, вы можете потерять строки , если у вас есть NULL s в других полях. Эти поля будут необязательными полями таблицы.

1 голос
/ 08 июля 2009

Поскольку у вас несколько столбцов SupplierID, я удивлен, что ваш оригинальный запрос сработал ... Механизм БД не знает, как использовать SupplierID из таблицы поставщиков или компьютеров ...

Редактировать: исправлено для ВНЕШНИХ СОЕДИНЕНИЙ!

SELECT
    Supplier.SupplierID,
    COUNT(Computers.ComputerID) as Computers,
    COUNT(Displays.DisplayID) as Displays,
    COUNT(Foos.FooID) as Foos,
    COUNT(Bars.BarID) as Bars
FROM
    Supplier
    LEFT JOIN
    Computers ON Supplier.SupplierID = Computers.SupplierID
    LEFT JOIN
    Displays ON Supplier.SupplierID = Displays.SupplierID
    LEFT JOIN
    Foos ON Supplier.SupplierID = Foos.SupplierID
    LEFT JOIN
    Bars ON Supplier.SupplierID = Bars.SupplierID
GROUP BY
    Supplier.SupplierID
0 голосов
/ 08 июля 2009

SELECT 
  SupplierID, COUNT(dbo.Computers.ComputerID), COUNT(dbo.Cameras.SupplierID) as Computers 
FROM Supplier 
INNER JOIN Computers ON Supplier.SupplierID = Computers.SupplierID 
INNER JOIN Cameras ON Supplier.SupplierID = Cameras.SupplierID
GROUP BY SupplierID
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...