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);