SQL - Transpose

后端 未结 3 1066
死守一世寂寞
死守一世寂寞 2021-01-26 23:33

i have small issues i have been trying to figure out in SQL. I have a table with Item Numbers, Attribute Names and Attribute values. Each Item Number might have same or differen

相关标签:
3条回答
  • 2021-01-27 00:12

    I have just done this for my own data and I found the following worked for me:

    Change the following line :

        PIVOT 
      (([ATTRIBUTE_VALUE])
      FOR   [ATTR_DISPLAY_NAME] IN ( Select* [ATTR_DISPLAY_NAME] FROM tbl_ICC))
    

    To:

    PIVOT 
      (max(attribute_values) FOR   [ATTR_DISPLAY_NAME] IN ( Select* [ATTR_DISPLAY_NAME] FROM tbl_ICC))
    

    Note I removed the Attribute_Value in the Pivot.

    *note: you need to check your variable names to ensure what I have written is what you need.

    0 讨论(0)
  • 2021-01-27 00:16

    You should probably be using two tables, the first one using the item number as the primary key with color, speed, mass, etc as it's columns. The second table could then have a one to many relationship with the first table on the item number and have the attribute names and attribute values as its columns. This will not only allow you to print out the data you need (by using a join), but it will make database maintenance easier over time as things change.

    0 讨论(0)
  • 2021-01-27 00:25

    You have some syntax errors in your original query

    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);
    
    0 讨论(0)
提交回复
热议问题