【问题标题】:How convert rows to columns in SQL ServerSQL Server 中如何将行转换为列
【发布时间】:2015-12-04 08:45:11
【问题描述】:

我正在寻找一种在 SQL Server 中将行转换为具有 动态列名 的列的有效方法。听说PIVOT不是很快,需要处理很多记录。

这是我的例子:

Id  Name      Type         Address
----------------------------------
1   A        Vendor         Add1
2   B        Vendor         Add2
3   C        Purchaser      Add3
4   D        Agent          Add4

要求的结果:

Vendor Name    Vendor Address    Vendor 1 Name    Vendor 1 Address  Purchaser Name    Purchaser Address    Agent Name    Agent Address
A              Add1              B                Add2              C                 Add3                 D             Add4 

如果第一个值是供应商,如果第二次供应商来,我如何构建列名称将创建动态的结果,那么它将显示为供应商 1 + 名称或地址?

【问题讨论】:

  • Pivot 应该可以满足您的需求。
  • 作为替代方案,您可以使用交叉表来执行此操作。交叉表的性能通常会优于 PIVOT,尤其是在行数增加时。 sqlservercentral.com/articles/T-SQL/63681
  • @GordonLinoff 我得到了将行转换为列的解决方案。但我希望列名应该是动态的...请咨询。
  • @SeanLange..... 如果值重复,是否可以使列名动态化?
  • @JatinGadhiya 当然。看一下交叉表的动态版本。 sqlservercentral.com/articles/Crosstab/65048

标签: sql sql-server stored-procedures view pivot


【解决方案1】:

您可以使用下表:

                CREATE TABLE TEMP (
                DATE DATETIME
                ,category VARCHAR(3)
                ,amount MONEY
                )

            INSERT INTO TEMP
            VALUES (
                '1/1/2012'
                ,'ABC'
                ,1000.00
                )

            INSERT INTO TEMP
            VALUES (
                '2/1/2012'
                ,'DEF'
                ,500.00
                )

            INSERT INTO TEMP
            VALUES (
                '2/1/2012'
                ,'GHI'
                ,800.00
                )

            INSERT INTO TEMP
            VALUES (
                '2/10/2012'
                ,'DEF'
                ,700.00
                )

            INSERT INTO TEMP
            VALUES (
                '3/1/2012'
                ,'ABC'
                ,1100.00
                )
                    DECLARE @cols AS NVARCHAR(MAX),
                    @query  AS NVARCHAR(MAX);

                SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(c.category) 
                            FROM temp c
                            FOR XML PATH(''), TYPE
                            ).value('.', 'NVARCHAR(MAX)') 
                        ,1,1,'')

                set @query = 'SELECT date, ' + @cols + ' from 
                            (
                                select date
                                    , amount
                                    , category
                                from temp
                           ) x
                            pivot 
                            (
                                 max(amount)
                                for category in (' + @cols + ')
                            ) p '


                execute(@query)

                drop table temp

【讨论】:

  • 你能给我完整的例子吗.. 这样我就可以和我的表格比较.. 或者我可以创建与你的脚本匹配的表格。
  • 您可以使用以下临时表:
  • 创建表临时(日期日期时间,类别varchar(3),金额)插入临时值('1/1/2012','ABC',1000.00)插入临时值('2 /1/2012', 'DEF', 500.00) 插入温度值 ('2/1/2012', 'GHI', 800.00) 插入温度值 ('2/10/2012', 'DEF', 700.00)插入临时值('3/1/2012'、'ABC'、1100.00)
  • 谢谢你..我已经尝试过你的例子并且它运行成功..但我认为你没有理解我的要求。您能否查看我更新的问题或我可以再次解释一下吗?
  • 为什么这个解决方案不符合您的要求? @JatinGadhiya
猜你喜欢
  • 1970-01-01
  • 2019-07-16
  • 1970-01-01
  • 1970-01-01
  • 2011-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多