SQL Объединение нескольких таблиц - PullRequest
1 голос
/ 29 мая 2020

SQL newb ie здесь, я пытаюсь распечатать таблицу с суммой заработной платы, марки и модели автомобиля для всех людей, владеющих определенной комбинацией марки / модели. На данный момент таблица выводит все значения марки и модели автомобиля, но столбец SumWage имеет значение NULL. SumWage должен возвращать общую сумму всех заработных плат людей, у которых есть комбинация марки / модели (мое выражение выбора находится полностью внизу кода)? Мы очень ценим все советы!

IF OBJECT_ID ('Person', 'U') IS NULL 

BEGIN

    CREATE TABLE Person (
        ID INT NOT NULL PRIMARY KEY,
        Name VARCHAR(32),
        BirthDate DATETIME 
        );

    INSERT INTO Person
        ( ID, Name, BirthDate )
    VALUES
        (311113, 'Dan Lu', '01-22-33'), 
        (123456, 'Seven Durant', '07-22-94'), 
        (100100, 'Choochootrain Lu', '12-17-56'),
        (106542, 'Spider Ru', '07-22-36'),
        (101010, 'Ru Ru', '04-30-84');
END

IF OBJECT_ID ('Job', 'U') IS NULL 

BEGIN

    CREATE TABLE Job (
        ID INT NOT NULL PRIMARY KEY,
        Company VARCHAR(64),
        Wage FLOAT,
        PersonID INT FOREIGN KEY REFERENCES Person(ID)
        );

    INSERT INTO Job
        ( ID, Company, Wage, PersonID )
    VALUES
        (01, 'Space Pizza Space', 1000.00, 311113), 
        (02, 'Bread', 46.44, 101010), 
        (03, 'Delivery Service', 400.99, 100100), 
        (04, 'Nike', 999900.01, 106542), 
        (05, 'Old McDonald', 6500210.77, 123456);
END


IF OBJECT_ID ('Car', 'U') IS NULL 

BEGIN

    CREATE TABLE Car (
        ID INT NOT NULL PRIMARY KEY,
        Make VARCHAR(32),
        Model VARCHAR(32)       
        );

    INSERT INTO Car
        ( ID, Make, Model )
    VALUES
        (1234, 'Lexus', 'SE'), 
        (4444, 'Tesla', 'X'), 
        (5007, 'Chevy', 'Cobalt'),
        (7771, 'Ford', 'Runner'),
        (6459, 'Toyota', 'Camry');
END

IF OBJECT_ID ('PersonCar', 'U') IS NULL 

BEGIN

    CREATE TABLE PersonCar (
        ID INT,
        PersonID INT FOREIGN KEY REFERENCES Person(ID),
        CarID INT       
        );

    INSERT INTO PersonCar
        ( ID, PersonID, CarID )
    VALUES
        (1, 311113, 1234), 
        (2, 123456, 4444), 
        (3, 100100, 5007),
        (4, 106542, 7771),
        (5, 101010, 6459);
END

SELECT SUM(Wage) AS SumWages, Car.Make, Car.Model
FROM Person
    INNER JOIN PersonCar 
        ON PersonCar.ID = Person.ID
    INNER JOIN Job 
        ON Job.PersonID = PersonCar.ID 
    Right JOIN Car
        ON Car.ID = Person.ID
GROUP BY Wage, Make, Model;

Ответы [ 2 ]

0 голосов
/ 29 мая 2020

Эй, похоже, есть пара ошибок с вашими СОЕДИНЕНИЯМИ. Посмотрите, сработает ли для вас переключение того, что вы СОЕДИНЯЕТЕСЬ, "ВКЛ", как показано ниже, и изменение последнего СОЕДИНЕНИЯ с ПРАВОГО на ВНУТРЕННЕЕ.

SELECT
  SUM(Job.Wage) AS SumWages
  , Car.Make
  , Car.Model
FROM
  Person
   INNER JOIN PersonCar 
    ON PersonCar.PersonID = Person.ID
   INNER JOIN Job 
    ON Job.PersonID = PersonCar.ID 
   INNER JOIN Car
    ON Car.ID = PersonCar.CarID
GROUP BY SumWages, Make, Model
;
0 голосов
/ 29 мая 2020

Я думаю, что вы хотите:

SELECT SUM(j.Wage) AS SumWages, c.Make, c.Model
FROM Car c
LEFT JOIN PersonCar pc ON pc.CarID = c.ID
LEFT JOIN Job j ON j.PersonID = pc.PersonID
GROUP BY c.Make, c.Model;

Это выбирает все Car s и соответствует отношениям к таблице Job, которая содержит Wage каждого владельца автомобиля. Данные агрегируются по моделям и моделям автомобилей, и рассчитывается соответствующая заработная плата.

Когда у данного кортежа марки / модели нет владельца автомобиля, сумма получается как null (если вы хотите просто удалить эти строки из набора результатов, используйте INNER JOIN s вместо LEFT JOIN s ).

Обратите внимание, что вам не нужно приносить таблицу Person, чтобы получить этот набор результатов.

...