我有一些小问题,我一直试图在SQL中弄清楚。我有一个包含项目编号,属性名称和属性值的表。每个项目编号可能具有与其属性值关联的相同或不同的属性名称集。我想要做的是在每种情况下拥有唯一的项目编号,并将属性名称转换为我的列,并将属性值置于相应的属性名称标题下。
在下图中是当前的tbl_ICC表:
我想要得到的是这个观点:
我在这里和其他来源上阅读了几篇类似的帖子,而我最接近的就是这个SQL查询:
SELECT*
FROM
(SELECT [ITEM_NUMBER],
[ATTR_DISPLAY_NAME],
[ATTRIBUTE_VALUE]
FROM tbl_ICC) AS SourceTable
PIVOT
(([ATTRIBUTE_VALUE])
FOR [ATTR_DISPLAY_NAME] IN ( Select* [ATTR_DISPLAY_NAME] FROM tbl_ICC))
AS PivotTable;
由于某种原因,我不断收到语法错误,查询没有给我任何东西。 为了将视图从image1转换为图像2上的视图,我需要在此处更改什么?
提前谢谢。
答案 0 :(得分:4)
原始查询中存在一些语法错误
SELECT *
FROM
(SELECT [ITEM_NUMBER],
[ATTR_DISPLAY_NAME],
[ATTRIBUTE_VALUE]
FROM tbl_ICC ) AS SourceTable
PIVOT (max([ATTRIBUTE_VALUE])
FOR [ATTR_DISPLAY_NAME] IN ([color],[size] )) -- << Add More Attr Display Name Here
AS PivotTable;
编辑 - 动态版
Declare @SQL varchar(max) = Stuff((Select Distinct ',' + QuoteName([ATTR_DISPLAY_NAME]) From tbl_ICC Order by 1 For XML Path('')),1,1,'')
Select @SQL = '
Select *
From (
Select [ITEM_NUMBER],
[ATTR_DISPLAY_NAME],
[ATTRIBUTE_VALUE]
From tbl_ICC
) A
Pivot (max(ATTRIBUTE_VALUE) For [ATTR_DISPLAY_NAME] in (' + @SQL + ') ) p'
Exec(@SQL);
答案 1 :(得分:0)
我刚刚为自己的数据做了这个,我发现以下内容对我有用:
更改以下行:
PIVOT
(([ATTRIBUTE_VALUE])
FOR [ATTR_DISPLAY_NAME] IN ( Select* [ATTR_DISPLAY_NAME] FROM tbl_ICC))
致:
PIVOT
(max(attribute_values) FOR [ATTR_DISPLAY_NAME] IN ( Select* [ATTR_DISPLAY_NAME] FROM tbl_ICC))
注意我删除了Pivot中的Attribute_Value。
*注意:您需要检查您的变量名称,以确保我所写的是您所需要的。
答案 2 :(得分:0)
您应该使用两个表,第一个使用项目编号作为主键,颜色,速度,质量等作为列。然后,第二个表可以与项目编号上的第一个表具有一对多的关系,并将属性名称和属性值作为其列。这不仅可以打印出您需要的数据(通过使用连接),而且随着时间的推移,它将使数据库维护更容易。