Выберите общую балансовую стоимость всех автомобилей для клиента (SQL) - PullRequest
0 голосов
/ 22 ноября 2010

У меня есть следующая схема базы данных (Microsoft SQL Server Compact Edition):

alt text

Как выбрать запись клиента или записи клиента с дополнительным полем, содержащим общееБалансовая стоимость всех транспортных средств, принадлежащих клиенту?Я пробовал что-то вроде:

SELECT Customers.ID, Customers.FirstName, ..., SUM(Receipts.BookValue) FROM Customers INNER JOIN Vehicles ON Vehicles.CustomerID = Customers.ID INNER JOIN Receipts ON Receipts.VehicleID = Vehicles.ID;

, но безуспешно.Я думаю, что мне может понадобиться GROUP BY или что-то?

Ответы [ 4 ]

3 голосов
/ 22 ноября 2010
SELECT Customers.ID, SUM(Receipts.BookValue) FROM Customers INNER JOIN Vehicles ON Vehicles.CustomerID = Customers.ID INNER JOIN Receipts ON Receipts.VehicleID = Vehicles.ID
GROUP BY Customers.ID

Также обратите внимание, что при использовании агрегатов, таких как Sum, вы должны убедиться, что все дополнительные поля являются частью типа агрегата или в списке GROUP BY.Внутренний запрос выполняет суммирование, а остальные отображают дополнительную информацию, например:

SELECT t.TheSum,
       c.ID,
       c.CompanyName FROM
   ( SELECT Customers.ID as TheID, 
           SUM(Receipts.BookValue) AS TheSum
    FROM Customers INNER JOIN Vehicles ON Vehicles.CustomerID = Customers.ID INNER JOIN    Receipts ON Receipts.VehicleID = Vehicles.ID
    GROUP BY Customers.ID
) t
INNER JOIN Customers c ON c.ID = t.TheID
0 голосов
/ 22 ноября 2010
select c.ID, c.FirstName, c.LastName, bv.BookValueSum
from Customers c
inner join (
    select v.CustomerID, sum(r.BookValue) as BookValueSum
    from Vehicles v
    inner join Receipts r on v.ID = r.VehicleID
    group by v.CustomerID
) bv on c.CustomerID = bv.CustomerID
0 голосов
/ 22 ноября 2010

Да, вам нужна ГРУ <list of every column that is not an aggregate> (СУММА, СЧЕТ и т. Д.)

0 голосов
/ 22 ноября 2010

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

SELECT 
  C.*,
  BV.TotalBookValue
FROM Customers C
Inner Join (SELECT 
              Customers.ID as CustomerID, 
              SUM(Receipts.BookValue) AS TotalBookValue
            FROM Customers 
            INNER JOIN Vehicles ON Vehicles.CustomerID = Customers.ID 
            INNER JOIN Receipts ON Receipts.VehicleID = Vehicles.ID
            GROUP BY Customers.ID) BV 
   ON C.ID = BV.CustomerID
...