0

新しいレポートの基本的なクエリを実行していて、この小さな障害に遭遇しました。

2 つのテーブルBuildings(B) とPictures(P) があり、両方にあるキーは BuildingNumber です。2 つのテーブル間に単純な内部結合があります。私が抱えている問題は、B にある 183 の建物があるのですが、建物ごとに複数の写真があり、建物ごとに写真の数が一貫していないことです。結果セットを取得すると、約 260 行が返されます。私がやりたいことは、建物ごとに 1 つの行だけを返し、その建物に関連付けられた各写真の列を作成することです。私にはテーブルを変更または作成する権限がないことに注意してください。

私のデータは次のようなものです:

建物表 (B):

BuildingNumber   BldgName   Floors   SqFt

  0001           Science       5     50000
  0002           Engineering   4     40000

ピクチャーテーブル (P):

BuildingNumber     PictureURL

   0001                URL1
   0001                URL2
   0001                URL3  
   0002                URL1 
   0002                URL2

したがって、私の目的の結果は次のように設定されます。

BuildingNumber   BldgName   Floors   SqFt   PictureURL1   PictureURL2   PictureURL3

    0001         Science        5     50000       URL1        URL2         URL3
    0002         Engineering    4     40000       URL1        URL2          NULL
4

1 に答える 1

4

PIVOT関数を使用して結果を取得できます。この関数は、データの行を列に変換します。

各建物の数が限られている場合はPictureURLs、クエリをハードコーディングできます。

select BuildingNumber, bldgname, floors, sqft,
  PictureURL1, PictureURL2, PictureURL3
from
(
  select b.BuildingNumber, b.bldgname, b.floors, b.sqft,
    p.PictureURL,
    col = 'PictureURL'+
            cast(row_number() over(partition by b.BuildingNumber
                                    order by b.BuildingNumber) as varchar(10))
  from building b
  inner join picture p
    on b.BuildingNumber = p.BuildingNumber
) d
pivot
(
  max(PictureURL)
  for col in (PictureURL1, PictureURL2, PictureURL3)
) piv;

SQL Fiddle with Demoを参照してください。ただし、値の数が不明な場合は、動的 SQL の使用を検討する必要があります。これにより、最終結果を取得するために実行される SQL 文字列が作成されます。

DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)

select @cols = STUFF((SELECT distinct ',' + QUOTENAME('PictureURL'+
                                                      cast(row_number() over(partition by BuildingNumber
                                                                              order by BuildingNumber) as varchar(10))) 
                    from Picture
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT BuildingNumber, bldgname, floors, sqft,' + @cols + ' 
            from 
            (
              select b.BuildingNumber, b.bldgname, b.floors, b.sqft,
                p.PictureURL,
                col = ''PictureURL''+
                        cast(row_number() over(partition by b.BuildingNumber
                                                order by b.BuildingNumber) as varchar(10))
              from building b
              inner join picture p
                on b.BuildingNumber = p.BuildingNumber
            ) x
            pivot 
            (
                max(PictureURL)
                for col in (' + @cols + ')
            ) p '

execute sp_executesql @query;

SQL Fiddle with Demoを参照してください。両方とも結果が得られます。

| BUILDINGNUMBER |    BLDGNAME | FLOORS |  SQFT | PICTUREURL1 | PICTUREURL2 | PICTUREURL3 |
|              1 |     Science |      5 | 50000 |        URL1 |        URL2 |        URL3 |
|              2 | Engineering |      4 | 40000 |        URL1 |        URL2 |      (null) |
于 2013-09-04T15:58:18.557 に答える