Darooma,
Честно говоря, постановка задачи наверное описана не полностью,
поэтому если я что то понял не так не обессудьте.
Получается - 3(два первых и один второй)
---------------------------------------------------
IF OBJECT_ID('dbo.ServicesToOrders', 'U') IS NOT NULL
DROP TABLE dbo.ServicesToOrders
IF OBJECT_ID('dbo.ServicesToPrices', 'U') IS NOT NULL
DROP TABLE dbo.ServicesToPrices
IF OBJECT_ID('dbo.Tariffs', 'U') IS NOT NULL
DROP TABLE dbo.Tariffs
IF OBJECT_ID('dbo.Prices', 'U') IS NOT NULL
DROP TABLE dbo.Prices
IF OBJECT_ID('dbo.Orders', 'U') IS NOT NULL
DROP TABLE dbo.Orders
IF OBJECT_ID('dbo.Services', 'U') IS NOT NULL
DROP TABLE dbo.Services
GO
Create table dbo.Tariffs (Id int primary key, Name nvarchar(100))
Create table dbo.Services (Id int primary key, Name nvarchar(100))
Create table dbo.Prices (Id int primary key, [decimal] decimal(18, 2))
Create table dbo.Orders (Id int primary key, Name nvarchar(100))
Create table dbo.ServicesToPrices (
id Int primary key, ServiceId int foreign key references dbo.Services (Id),
tariffId int null foreign key references dbo.Tariffs (Id),
PriceId int foreign key references dbo.Prices (Id))
Create table dbo.ServicesToOrders(
ServiceId int foreign key references dbo.ServicesToPrices (Id),
OrderId int foreign key references dbo.Orders (Id))
----------------------------
Insert dbo.Tariffs Values (1,'T1'),(2,'T2')
Insert dbo.Services Values (1,'S1'),(2,'S2'),(3,'S3'),(4,'S4'),
(5,'S5'),(6,'S6'),(7,'S7'),(8,'S8'),(9,'S9'),(10,'S10')
Insert dbo.Prices Values (1,100.0),(2,200.0),(3,200.0)
Insert dbo.Orders Values (1,'1_T1S1'),(2,'1_T1S2'),(3,'1_T1S3'),(4,'1_T1S4'),
(5,'2_T1S1'),(6,'2_T1S2'),(7,'2_T1S3'),(8,'2_T1S4'),
(9,'1_T2S1'),(10,'1_T2S2'),(11,'1_T2S3'),
(12,'S5'),(13,'S6'),(14,'S7'),(15,'S8'),(16,'S9'),(17,'S10')
Insert dbo.ServicesToPrices Values
(1,1,1,1),(2,2,1,1),(3,3,1,1),(4,4,1,1),
(5,1,2,2),(6,2,2,2),(7,3,2,2),
(8,5,null,3),(9,6,null,3),(10,7,null,3),(11,8,null,3),(12,9,null,3),(13,10,null,3)
Insert dbo.ServicesToOrders Values
(1,1),(2,2),(3,3),(4,4),
(1,5),(2,6),(3,7),(4,8),
(5,9),(6,10),(7,11),
(8,12),(9,13),(10,14),(11,15),(12,16),(13,17)
;with Serv (tariffId,countServ) As
(
SELECT sp.tariffId,COUNT(sto.ServiceId)
FROM dbo.Orders ord
INNER JOIN dbo.ServicesToOrders sto
ON ord.Id = sto.OrderId
INNER JOIN dbo.ServicesToPrices sp
ON sp.Id = sto.ServiceId
WHERE sp.TariffId IS NOT NULL Group by sp.tariffId
),
Serv2(tariffId,countServ)as(
SELECT sp.tariffId,COUNT(*)
FROM ServicesToPrices sp
WHERE sp.TariffId IS NOT NULL Group by sp.tariffId
)
select SUM(countTarriff) from (
select Serv.tariffId,Serv.countServ/Serv2.countServ as countTarriff From Serv INNER JOIN Serv2
ON Serv.tariffId = Serv2.tariffId) as serv3