2016-10-14 26 views
1

私はこのクエリを持っている:予想通りこのクエリに2つの選択肢があるのはなぜですか?

SELECT   WorkId, RegisterDate, sum(RoomType1) As RoomType1, sum(RoomType2) As RoomType2, sum(RoomType3) As RoomType3, sum(RoomType4) As RoomType4, sum(RoomType5) As RoomType5, sum(RoomType6) As RoomType6, sum(RoomType7) As RoomType7, sum(RoomType8) As RoomType8 
FROM (

SELECT  dbo.[Work].WorkId, dbo.[Work].RegisterDate, 

case dbo.Floor.RoomType when 1 then 1 else 0 end as RoomType1, 
     case dbo.Kat.RoomType when 2 then 1 else 0 end as RoomType2, 


FROM   dbo.Belediye INNER JOIN 
         dbo.[Is] ON dbo.Municipality.MunicipalityId= dbo.[Is].MunicipalityWorkId INNER JOIN 
         dbo.Look ON dbo.[Work].LookWorkId = dbo.Look.LookId , 
WHERE  (dbo.Look.LocationIS NOT NULL) 

) E 
GROUP BY WorkId, 

このクエリは動作しますが、それは2を選択した理由私はなぜそれがそれらを必要ない、理解できないのですか?それを私に説明してください。ありがとう。

+7

を使用しています。複雑な表現を2回書くのを避けるために 'group by 'を実行すると非常に便利です。 (これはANSI SQLでも許可されていません。) – jarlh

+2

この場合、実際には必要ないようです。 1つの選択でグループ化を行い、 'sum(case ... end)'を実行できます。 – LukStorms

答えて

3

あなたは2選択を必要といけないし、サブクエリなしに書き換えることができ、このクエリを疑われたよう:

SELECT i.IsId, 
     i.KayitTarihi, 
     SUM(case k.OdaTipi when 1 then 1 else 0 end) as RoomType1, 
     SUM(case k.OdaTipi when 2 then 1 else 0 end) as RoomType2, 
     SUM(case k.OdaTipi when 3 then 1 else 0 end) as RoomType3, 
     SUM(case k.OdaTipi when 4 then 1 else 0 end) as RoomType4, 
     SUM(case k.OdaTipi when 5 then 1 else 0 end) as RoomType5, 
     SUM(case k.OdaTipi when 6 then 1 else 0 end) as RoomType6, 
     SUM(case k.OdaTipi when 7 then 1 else 0 end) as RoomType7, 
     SUM(case k.OdaTipi when 8 then 1 else 0 end) as RoomType8 
FROM dbo.Belediye b 
INNER JOIN dbo.[Is] i 
    ON b.BelediyeId = i.BelediyeIsId 
INNER JOIN dbo.YerGorme yg 
    ON i.YerGormeIsId = yg.YerGormeId 
INNER JOIN dbo.Kat k 
    ON yg.YerGormeId = k.YerGorme_YerGormeId 
WHERE yg.Lokasyon IS NOT NULL 
GROUP BY i.IsId, i.KayitTarihi 

注:内部の選択が派生テーブルと呼ばれるtable aliases

関連する問題