1

私は4つのテーブルを持っています:

Service (serviceId(PK), serviceTypeId, capacity)
Facilitator (facilitatorId(PK), facilitatorName)
ServiceType (serviceTypeId(PK), serviceType)
ServiceFacilitator (serviceId(PK), facilitatorId(PK)) (join entity)

現在、「ServiceType」テーブルのサービス タイプは、ホテルとカンファレンス センターです。

「Service」テーブルの「capacity」列には、ServiceType.serviceTypeId に関連する場合にのみ意味のある数値が含まれます。つまり、サービスの種類に応じてベッドまたは座席を表します。

facilitatorName、Beds、Seat の 3 つの列を返すクエリを作成する必要があります。

ストアドプロシージャで一時テーブルを作成および破棄することは、将来のスケーラビリティなどに悪影響を与える可能性がある不十分なソリューションであり、ソリューションには Service テーブルでの自己結合が含まれることはほぼ確実です。

これまでのところ、クエリは次のようになっていますが、行は返されません。私は何が欠けていますか?

SELECT f.facilitatorName,(SUM(ts1.capacity)) as Beds,(SUM(ts2.capacity)) as Seats

FROM dbo.Facilitator as f,
        dbo.TestService as ts1,
        dbo.TestService as ts2,
        dbo.ServiceFacilitator as sf

WHERE f.facilitatorId = sf.facilitatorId AND
        (sf.serviceId = ts1.serviceId or
        sf.serviceId = ts2.serviceId) and 
        ts1.serviceId = ts2.serviceId and
        ts1.serviceTypeId = '1' and -- type hotel
        ts2.serviceTypeId = '2' -- type conference centre           

GROUP BY f.facilitatorName

このようにクエリを 2 つに分割すると、Beds と Seats の正確な結果が返されます。

SELECT f.facilitatorName,(SUM(ts1.capacity)) as Beds

FROM dbo.Facilitator as f,
        dbo.TestService as ts1,
        dbo.ServiceFacilitator as sf

WHERE f.facilitatorId = sf.facilitatorId AND
        sf.serviceId = ts1.serviceId and 
        ts1.serviceTypeId = '1'         

GROUP BY f.facilitatorName

SELECT f.facilitatorName,(SUM(ts2.capacity)) as Seats

FROM dbo.Facilitator as f,
        dbo.TestService as ts2,
        dbo.ServiceFacilitator as sf

WHERE f.facilitatorId = sf.facilitatorId AND
        sf.serviceId = ts2.serviceId and 
        ts2.serviceTypeId = '2'         

GROUP BY f.facilitatorName

ありがとうございました..

4

2 に答える 2

3

クエリの簡単な解決策は次のとおりです。

SELECT f.facilitatorName,
       SUM(case when ts.serviceTypeId = '1' then ts.capacity end) as Beds,
       SUM(case when ts.serviceTypeId = '2' then ts.capacity end) as Seats
FROM dbo.Facilitator as f
LEFT JOIN dbo.ServiceFacilitator as sf ON f.facilitatorId = sf.facilitatorId
LEFT JOIN dbo.TestService as ts ON sf.serviceId = ts.serviceId
GROUP BY f.facilitatorName
于 2013-02-07T12:35:57.487 に答える
0

このクエリにはJoinを使用する必要があります。例えば:

SELECT f.facilitatorName,(SUM(ts1.capacity)) as Beds,(SUM(ts2.capacity)) as Seats

FROM 
        dbo.ServiceFacilitator as sf 
join dbo.Facilitator as f 
on   sf.facilitatorI = f.facilitatorId
join dbo.TestService as ts1 
on sf.serviceId = ts1.serviceId
join  dbo.TestService as ts1
on sf.serviceId = ts2.serviceId

WHERE 
        ts1.serviceTypeId = '1' and -- type hotel
        ts2.serviceTypeId = '2' -- type conference centre           

GROUP BY f.facilitatorName
于 2013-02-07T13:20:17.433 に答える