0

我不确定我的问题是否正确表达,因为我尝试了 SO 建议的帖子,但没有完全找到我想要的内容。

简而言之,我试图表明一个公民属于哪个“地区”。每个公民将与 3 个区域相关联BoroughNeighbourhoodNatural Neighbourhood。公民通过一个连接表链接到每个区域。

我只需要一行(对于数据库中的每个公民)来显示他们所属的所有区域。

目标是这样的:

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。我现在有了这个,它经过稍微重新设计,可以在我的数据库中使用确切的表名。我最初收到错误:

“'pivot' 附近的语法不正确。您可能需要将当前数据库的兼容级别设置为更高的值才能启用此功能。请参阅 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 回答