【发布时间】:2017-04-25 06:03:26
【问题描述】:
我设计了一个 EAV 表,如下所示:
SID AID VID
1 1 1
1 2 1
1 3 2
1 4 3
1 1 2
SID代表Subject ID,AID代表Attribute ID,VID代表ValuedID
也是一个映射属性的表:
AttributeID AttributeName
1 Hobbies
2 Name
3 Gender
4 IrisColor
在第一个表上使用pivot后,链接到属性表:
SELECT
SubjectID,
Hobbies,
Name,
Gender,
IrisColor
FROM
(
SELECT SubjectID, attr.AttributeName as attribute, ValueID from SubjectDetails, SubjectAttributes as attr WHERE SubjectDetails.AttributeID=attr.ID
) as t
PIVOT(
MAX(ValueID)
FOR attribute IN (Hobbies,Name,Gender,IrisColor)) AS t1
WHERE SubjectID=1
我明白了:
SubjectID Hobbies Name Gender IrisColor
1 1 1 2 3
这几乎是正确的,但是SubjectAttribute 1(即爱好)在第一个表(SubjectDetails)中又出现了一次,所以我想要实现的是:
SubjectID Hobbies Name Gender IrisColor
1 **1,2** 1 2 3
我不得不提一下,我不关心使用什么分隔符,我尝试使用 STUFF 函数来做到这一点,但是将 PIVOT 和 STUFF 结合起来很痛苦(或者我只是不知道如何)..有什么建议吗?
【问题讨论】:
-
您可以修改源 EAV 表,使其每个属性有一行,并使用逗号分隔值,然后使用您的数据透视查询进行数据透视。
-
我不能这样做.. 要求是每个属性都有单独的行,即使它重复。我只是不想在视图中这样做,而不是像用逗号分隔那样存储它
标签: sql-server database pivot rows multivalue