0

SOの提案された投稿を試したので、私の質問が適切に表現されているかどうかはわかりませんが、探していたものが見つかりませんでした.

一言で言えば、私は市民がどの「地域」に属しているかを示そうとしています。Boroughすべての市民は、 、 、 のNeighbourhood3つのエリアに関連付けられNatural Neighbourhoodます。市民は、結合テーブルによって各エリアにリンクされています。

市民が属するすべての地域を示す 1 行 (データベース内の市民ごと) だけが必要です。

目標はこれです:

CitizenId  CitizenName  Borough     Neighbourhood       NaturalNeighbourhood
----------------------------------------------------------------------------
1          Fred         Elmbridge   Esher & Claygate    Esher

関連するテーブルを以下に示します。

市民

ID  Name
1   Fred

エリアカテゴリー

ID  Value
1   root
2   Division
3   Borough
4   Neighbourhood
5   Natural Neighbourhood

エリアタイプ

ID  FK_AreaCategory   Value
1   3                 Elmbridge
2   4                 Esher & Claygate
3   5                 Esher

市民エリア

FK_Citizen   FK_AreaType
1            3
1            4
1            5

自分のことを知っている人にとっては間違いなく簡単ですが、どのようにアプローチすればよいかわかりません。

前もって感謝します。

ありがとう@podiluska。これは、データベース内の正確なテーブル名を使用するために少し作り直されました。最初にエラーを受け取りました:

「「ピボット」付近の構文が正しくありません。この機能を有効にするには、現在のデータベースの互換性レベルをより高い値に設定する必要がある場合があります。ALTER DATABASE の SET COMPATIBILITY_LEVEL オプションのヘルプを参照してください。」

次に、データベースが SQL Server 2000 と互換性があることを確認しました。これを SQL Server 2008 互換に変更すると、すべてが機能しました。

USE ACRM
GO
select 
   *
from
(
select c.ID, FirstName, at.Value as area, ac.value as category
from
ACRM.DBO.ActiveCitizen c
    inner join ACRM.DBO.ActiveCitizenAreas ca on c.Id = ca.FK_ActiveCitizen
    inner join ACRM.DBO.AreaType at on ca.FK_AreaType = at.ID
    inner join ACRM.DBO.AreaCategory ac on at.FK_AreaCategory = ac.id
) v
pivot (max(area) for category in (Borough, Neighbourhood, [Natural Neighbourhood])) p

ありがとう。

4

1 に答える 1

2

使用するpivot

select 
    *
from
(
select c.ID, Name, at.Value as area, ac.value as category
from
    citizen c
        inner join citizenAreas ca on c.Id = ca.FK_Citizen
        inner join areatype at on ca.FK_AreaType = at.ID
        inner join areaCategory ac on at.FK_AreaCategory = ac.id
) v
pivot (max(area) for category in (Borough, Neighbourhood, [natural neighbourhood])) p
于 2013-10-21T09:58:21.733 に答える