Помогите с выборкой

Darooma
Дата: 06.06.2011 13:33:11
Несколько таблиц для заказа сервисов, которые могут в составе тарифов, а могут быть без тарифов.
Create table #Tariffs (Id int, Name nvarchar(100))
Create table #Services (Id int, Name nvarchar(100))
Create table #Prices (Id int, decimal (decimal(18, 2))
Create table #Orders (Id int, Name nvarchar(100))

Create table ServicesToPrices (
Int id, ServiceId int foreign key references Services (Id),
tariffId int null foreign key references Services (Id),
PriceId int foreign key references Prices (Id))

Create table #ServicesToOrders(
ServiceId int foreign key references ServicesToPrices (ServiceId),
OrderId int foreign key references Orders (Id))

После заказа сервиса (не важно, в составе тарифа или нет), появляется запись в Orders (или записи) и столько же записей в ServicesToOrders. Например, если в составе одного тарифа 4 сервиса, а в составе другого 3, то после заказа 2ух первых тарифов и одного второго в таблицах Orders и ServicesToOrders появятся 11 записей. Если еще заказать 6 сервисов, то появится еще 6 записей.

Нужно выбрать общее количество (число) заказанных тарифов. Но как это сделать, я не знаю.
SELECT  COUNT(sp.TariffId)
            FROM    Orders ord
                    INNER JOIN ServicesToOrders sto
                    ON ord.Id = sto.OrderId
                    INNER JOIN ServicesToPrices sp
                    ON sp.Id = sto.ServicePriceId
                    

            WHERE    sp.TariffId IS NOT NULL
Конечно же выдает общее число заказанные сервисов, но не тарифов.
korneyr
Дата: 06.06.2011 16:53:51
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
Darooma
Дата: 06.06.2011 17:55:42
korneyr,

спасибо, но у меня была ошибка в схеме данных.