【问题标题】:Convert rows into columns sql server将行转换为列sql server
【发布时间】:2016-07-25 11:57:01
【问题描述】:

我想将行转换为列。

Column1 Column2    Column3     Column4  Column5 Column6 Column7
 1      2016-07-25  7           3        c1      c11    c111
 2      2016-07-26  5           2        c2      c22    c222
 3      2016-07-27  1           2        c3      c33    c333
 4      2016-07-28  3           1        c4      c44    c444

我想要输出如下:

Column1        1            2         3           4
Column2    2016-07-25    2016-07-26  2016-07-27  2016-07-28
Column3        7            5         1           3
Column4        3            2         2           1
Column5       c1            c2       c3          c4
Column6       c11           c22      c33         c44
Column7       c111          c222     c333        c44

我尝试使用 pivot unpivot 执行此操作,但没有找到合适的解决方案。 第一个表(输入)可以有 n 行。

【问题讨论】:

  • 当你写“我想要输出......”时,你是什么意思?输出到屏幕,到表格?
  • 我正在寻找 select 语句,它将反转第一个表,即输入表到我需要的格式

标签: sql sql-server transpose


【解决方案1】:

您需要使用 UNPIVOT,然后是 PIVOT,如果列数未知 - 动态 SQL:

DECLARE @columns nvarchar(max), 
        @columns_with_convert nvarchar(max),
        @row_numbers nvarchar(max),
        @sql nvarchar(max)

SELECT @columns = STUFF((
SELECT ','+QUOTENAME(name)
FROM sys.columns
WHERE [object_id] = OBJECT_ID('##YourTable')
FOR XML PATH('')),1,1,'')
--Will get you [Column1],[Column2],[Column3],[Column4],[Column5],[Column6],[Column7]

SELECT @columns_with_convert = (
SELECT 'CAST('+QUOTENAME(name)+' as nvarchar(max)) as '+QUOTENAME(name) +','
FROM sys.columns
WHERE [object_id] = OBJECT_ID('##YourTable')
FOR XML PATH(''))
--Will get you CAST([Column1] as nvarchar(max)) as [Column1], ... because all rows must be same datatype.

SELECT @row_numbers = STUFF((
SELECT ','+ QUOTENAME(CAST(ROW_NUMBER() OVER (ORDER BY (SELECT 1)) as nvarchar(max)))
FROM ##YourTable
FOR XML PATH('')),1,1,'')
--This will be used when PIVOTing ([1],[2],[3],[4])

SELECT @sql = '
SELECT *
FROM (
    SELECT  RN, 
            [Columns],
            [Values]
    FROM (
        SELECT  '+@columns_with_convert+'
                ROW_NUMBER() OVER (ORDER BY (SELECT 1)) as RN
        FROM ##YourTable
        ) as p
    UNPIVOT (
        [Values] FOR [Columns] IN ('+@columns+')
    ) as unpvt
) as s
PIVOT (
    MAX([Values]) FOR RN IN ('+@row_numbers+')
) as pvt
'

EXEC sp_executesql @sql

输出:

Columns 1           2           3           4
Column1 1           2           3           4
Column2 2016-07-25  2016-07-26  2016-07-27  2016-07-28
Column3 7           5           1           3
Column4 3           2           2           1
Column5 c1          c2          c3          c4
Column6 c11         c22         c33         c44
Column7 c111        c222        c333        c444

如果你PRINT @sql你会得到一个查询文本:

SELECT *
FROM (
    SELECT  RN, 
            [Columns],
            [Values]
    FROM (
        SELECT  CAST([Column1] as nvarchar(max)) as [Column1],CAST([Column2] as nvarchar(max)) as [Column2],CAST([Column3] as nvarchar(max)) as [Column3],CAST([Column4] as nvarchar(max)) as [Column4],CAST([Column5] as nvarchar(max)) as [Column5],CAST([Column6] as nvarchar(max)) as [Column6],CAST([Column7] as nvarchar(max)) as [Column7],
                ROW_NUMBER() OVER (ORDER BY (SELECT 1)) as RN
        FROM ##YourTable
        ) as p
    UNPIVOT (
        [Values] FOR [Columns] IN ([Column1],[Column2],[Column3],[Column4],[Column5],[Column6],[Column7])
    ) as unpvt
) as s
PIVOT (
    MAX([Values]) FOR RN IN ([1],[2],[3],[4])
) as pvt

【讨论】:

  • 非常感谢 :) 它正在按预期工作 :)
【解决方案2】:

我尝试使用 pivot unpivot 执行此操作,但没有找到合适的解决方案。 第一个表(输入)可以有 n 行。

它不起作用的原因是因为 PIVOT 不适用于动态行数。这意味着语法只能将固定数量的行转换为列,您需要在查询中指定它。它不能根据行中的值动态地自动生成列。

编辑:

我为动态数据中心找到的一个解决方案(谷歌搜索的第一个结果):https://www.mssqltips.com/sqlservertip/2783/script-to-create-dynamic-pivot-queries-in-sql-server/

需要动态SQL(没有其他选择)

【讨论】:

  • 是的,我同意你的看法。有没有其他方法可以解决这个问题??
  • @AboliOgale 检查上面已编辑的答案以获取链接
【解决方案3】:
DECLARE @TABLE TABLE 
   (RowNo INT,Col1 VARCHAR(10),Col2 VARCHAR(10)
   ,Col3 VARCHAR(10))      
INSERT INTO @TABLE VALUES 
   (1,'A','B','C')
SELECT Kishore from @Table
Unpivot(Kishore For Value IN (Col1,Col2,Col3)) AS H

【讨论】:

    猜你喜欢
    • 2021-02-24
    • 2010-10-22
    • 2013-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多