Рассчитать сумму из разных таблиц с условием - PullRequest
0 голосов
/ 26 мая 2011

У меня есть 4 таблицы SQL Server 2005: MainTable, Info, Ремонт, Обслуживание

Таблица MainTable:

MainID, PlateNo
1, A123
2, D222

Таблица информации:

InfoID, MainID, Location
1, 1, California
2, 2, Ohio

Таблица ремонта:

RepairID, MainID, Cost, InvoiceNo, InvoiceDate
1, 1, 250, 3423523, 12/10/2010
2, 1, 340, 5634534, 08/11/2010
3, 2, 125, 9258143, 10/02/2010

Таблица обслуживания:

MaintenanceID, MainID, Cost, InvoiceNo, InvoiceDate
1, 1, 223, 9694534, 07/03/2009
2, 2, 830, 4259943, 01/02/2011

Все таблицы связаны по MainID из MainTable.

Я хочу получить SUM (стоимость) от ремонта, SUM (стоимость) от обслуживания между двумя датами (InvoiceDate) для заданного «местоположения» из информационной таблицы для каждого PlateNo.

Ответы [ 2 ]

0 голосов
/ 27 мая 2011

ПОПРОБУЙТЕ

select 

isnull(sum(a.[ Cost]) + sum(b.[ Cost]),0) cost,
a.[ MainID],a.[ InvoiceDate]

from 

[maintanen] a inner join 
[repairs] b 

on a.[ MainID]=b.[ MainID]


group by a.[ MainID],a.[ InvoiceDate]

КОМБИНИРОВАННОЕ РАСПОЛОЖЕНИЕ

0 голосов
/ 26 мая 2011

Я бы подошел к этому запросу, используя производные таблицы. Вы также можете легко использовать обычные табличные выражения.

Select Main.MainId,
       Main.PlateNo,
       Info.Location,
       MaintenanceCosts.MaintenanceCost,
       RepairCosts.RepairCost
From   Main
       Inner Join Info
         On Main.MainId = Info.MainId
       Left Join (
         Select MainId, Sum(Cost) As MaintenanceCost
         From   Maintenance
         Where  InvoiceDate >= @StartDate
                And InvoiceDate < @EndDate
         Group By MainId
         ) As MaintenanceCosts
         On Main.MainId = MaintenanceCosts.MainId
       Left Join (
         Select MainId, Sum(Cost) As RepairCost
         From   Repairs
         Where  InvoiceDate >= @StartDate
                And InvoiceDate < @EndDate
         Group By MainId
         ) As RepairCosts
         On Main.MainId = RepairCosts.MainId
Where  Info.Location = @Location 
...