SQL - 转置
SQL - Transpose
我有一些小问题一直在 SQL 中试图解决。我有一个包含项目编号、属性名称和属性值的 table。每个项目编号可能具有与其属性值关联的相同或不同的属性名称集。我想做的是每行都有唯一的项目编号,并将属性名称转置为我的列,在这种情况下,将属性值置于相应的属性名称 header 下。
下图是当前tbl_ICC table:
我想得到的是这个视图:
我在这里和其他来源上阅读了几篇类似的帖子,我最接近的是这个 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;
出于某种原因,我不断收到语法错误,而且查询没有给我任何信息。
我需要在此处更改什么才能将视图从图像 1 转换为图像 2 上的视图?
提前谢谢你。
我刚刚为我自己的数据做了这个,我发现以下对我有用:
更改以下行:
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。
*注意:你需要检查你的变量名以确保我写的是你需要的。
您可能应该使用两个 table,第一个使用项目编号作为主键,颜色、速度、质量等作为列。然后,第二个 table 可以与项目编号上的第一个 table 建立一对多关系,并将属性名称和属性值作为其列。这不仅可以让您打印出所需的数据(通过使用连接),而且随着时间的推移,随着时间的推移,随着时间的推移,数据库维护也会变得更加容易。
您的原始查询中存在一些语法错误
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;
EDIT - Dynamic Version
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);
我有一些小问题一直在 SQL 中试图解决。我有一个包含项目编号、属性名称和属性值的 table。每个项目编号可能具有与其属性值关联的相同或不同的属性名称集。我想做的是每行都有唯一的项目编号,并将属性名称转置为我的列,在这种情况下,将属性值置于相应的属性名称 header 下。
下图是当前tbl_ICC table:
我想得到的是这个视图:
我在这里和其他来源上阅读了几篇类似的帖子,我最接近的是这个 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;
出于某种原因,我不断收到语法错误,而且查询没有给我任何信息。 我需要在此处更改什么才能将视图从图像 1 转换为图像 2 上的视图?
提前谢谢你。
我刚刚为我自己的数据做了这个,我发现以下对我有用:
更改以下行:
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。
*注意:你需要检查你的变量名以确保我写的是你需要的。
您可能应该使用两个 table,第一个使用项目编号作为主键,颜色、速度、质量等作为列。然后,第二个 table 可以与项目编号上的第一个 table 建立一对多关系,并将属性名称和属性值作为其列。这不仅可以让您打印出所需的数据(通过使用连接),而且随着时间的推移,随着时间的推移,随着时间的推移,数据库维护也会变得更加容易。
您的原始查询中存在一些语法错误
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;
EDIT - Dynamic Version
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);