SQL - 转置

时间:2017-04-19 00:58:25

标签: sql sql-server tsql pivot

我有一些小问题,我一直试图在SQL中弄清楚。我有一个包含项目编号,属性名称和属性值的表。每个项目编号可能具有与其属性值关联的相同或不同的属性名称集。我想要做的是在每种情况下拥有唯一的项目编号,并将属性名称转换为我的列,并将属性值置于相应的属性名称标题下。

在下图中是当​​前的tbl_ICC表:

enter image description here

我想要得到的是这个观点:

enter image description here

我在这里和其他来源上阅读了几篇类似的帖子,而我最接近的就是这个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上的视图,我需要在此处更改什么?

提前谢谢。

3 个答案:

答案 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)

您应该使用两个表,第一个使用项目编号作为主键,颜色,速度,质量等作为列。然后,第二个表可以与项目编号上的第一个表具有一对多的关系,并将属性名称和属性值作为其列。这不仅可以打印出您需要的数据(通过使用连接),而且随着时间的推移,它将使数据库维护更容易。