【问题标题】:Trying to pivot multiple columns in T-SQL尝试在 T-SQL 中旋转多个列
【发布时间】:2017-04-24 06:10:52
【问题描述】:

我有一个动态生成不同行数的查询,具有不同的 ID 列值。我需要能够将其转换为柱状结果。我目前的数据结果如下。

ID    Caption    FieldName     FieldType
---   ---------  ------------  ------------ 
10    Caption 1  Field Name 1  Field Type 1 
11    Caption 2  Field Name 2  Field Type 2 
12    Caption 3  Field Name 3  Field Type 3 
20    Caption 4  Field Name 4  Field Type 4 
30    Caption 5  Field Name 5  Field Type 5

我想要的结果是

10            11            12            20            30
--------      ----------    ---------     ---------     --------- 
Caption 1     Caption 2     Caption 3     Caption 4     Caption 5
Field Name 1  Field Name 2  Field Name 3  Field Name 4  Field Name 5
Field Type 1  Field Type 2  Field Type 3  Field Type 4  Field Type 5

请注意,值 10、11、12、20 和 30 可以更改为其他值,所以我知道我需要做一些动态 sql。如果可能,我想避免使用 CURSORS。

欢迎提出任何建议。请原谅格式

【问题讨论】:

  • 如果你明白你需要做一些动态sql,为什么不在帖子中包含你已经尝试过的代码?
  • 我只看了另一篇帖子才明白我必须做的,但我不确定如何将我的代码粘贴到这里。尝试粘贴代码时@给了我一些错误..
  • 我什至不确定这个是否可以称为 PIVOT。您似乎正在尝试转置表格。

标签: sql-server tsql sql-server-2005


【解决方案1】:

2005版

Declare @SQL varchar(max) 
Select  @SQL = stuff((Select Distinct ',' + QuoteName(ID)+'=max(case when Item='+cast(ID as varchar(25))+' then Value else null end)' From  YourTable Order By 1 For XML Path('') ),1,1,'')
Select  @SQL = '
 Select [Seq],'+@SQL +'
 From   (
         Select Item=A.ID,B.* 
         From  YourTable A
         Cross Apply ( 
                       Select Seq=1,Value=cast(A.Caption   as varchar(max))  Union All
                       Select Seq=2,Value=cast(A.FieldName as varchar(max))  Union All
                       Select Seq=3,Value=cast(A.FieldType as varchar(max))
                      ) B
        ) A
Group By Seq
Order By Seq
'
Exec(@SQL);

返回

【讨论】:

    【解决方案2】:

    如果你不介意动态

    我对删除 SEQ(结果的第一列)犹豫不决。您可以从最终查询中删除 [SEQ],,但我不确定它是否会在更大的数据集上保持正确的顺序。

    Declare @SQL varchar(max) 
    Select  @SQL = Stuff((Select Distinct ',' + QuoteName(ID) From YourTable Order by 1 For XML Path('')),1,1,'') 
    Select  @SQL = '
     Select [Seq],' + @SQL + '
      From (
            Select Item=A.ID,B.* 
             From  YourTable A
             Cross Apply (
                           Select Seq=1,Value=cast(A.Caption   as varchar(max)) Union All
                           Select Seq=2,Value=cast(A.FieldName as varchar(max)) Union All
                           Select Seq=3,Value=cast(A.FieldType as varchar(max))
                         ) B
           ) A
     Pivot (max(value) For Item in (' + @SQL + ') ) p'
    Exec(@SQL);
    

    返回

    编辑 - 从最终选择中删除 SEQ

    【讨论】:

    • 结果是我想要的,但是在使用上面的代码时出现语法错误。它给了我一个语法错误新值
    • 视情况而定。我正在获取页面上显示的字段列表。我正在尝试创建一个通用脚本,以便将它们输出为可以导出到 excel 的格式。这些excel表格可以通过填充数据进行自动化测试。这些字段的数量可以在 10-60 之间变化
    • 在生成上面列出的用于旋转的输出之前,我通过根据特定条件添加或删除一些字段来进行大量操作。因此,ID 列可能不一致,因此页面之间的值相同
    • Msg 156, Level 15, State 1, Line 1 关键字“值”附近的语法不正确。只是为了确认。这是 T-SQL 对吧?
    • @gsva 是的 SQL 服务器。只是好奇你用的是什么版本?
    猜你喜欢
    • 2017-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-27
    • 1970-01-01
    相关资源
    最近更新 更多