Sql server 如何使用T-SQL将行透视到数据?

Sql server 如何使用T-SQL将行透视到数据?,sql-server,tsql,pivot,Sql Server,Tsql,Pivot,我有以下数据: code desc amt month ----- ---------- ----- ------ aa item aa 12 4/2019 aa item aa 7 5/2019 bb item bb 5 4/2019 bb item bb 35 5/2019 bc widget bc 109 3/2019 bc widget bc 100 4/2019 df

我有以下数据:

code  desc       amt   month
----- ---------- ----- ------
aa    item aa    12    4/2019
aa    item aa    7     5/2019
bb    item bb    5     4/2019
bb    item bb    35    5/2019
bc    widget bc  109   3/2019
bc    widget bc  100   4/2019
df    widget df  29    5/2019
我希望透视此数据,使其如下所示:

code  desc       3/2019   4/2019   5/2019
----- ---------- -------- -------- --------
aa    item aa         0       12        7
bb    item bb         0        5       35
bc    widget bc     109      100        0
df    widget df       0        0       29

我看到的所有pivot示例都包含聚合函数,但是,我不想聚合,我只需要合并/转置数据。我该怎么做呢?

T-sql中有一个pivot函数可以直接使用,试试这个

T-sql中有一个pivot函数,您可以直接使用,试试这个

假设您想要动态列。。。然后需要一点动态SQL

示例

Declare @SQL varchar(max) = '
Select *
 From YourTable
 Pivot (sum(amt) For [month] in (' + Stuff((Select Distinct ','+QuoteName(month) 
                                               From YourTable A  
                                               Order By 1 
                                               For XML Path('')),1,1,'')  + ') ) p'
Exec(@SQL);
--Print @SQL
返回

Select *
 From  YourTable
 Pivot (sum(amt) For [month] in ([3/2019],[4/2019],[5/2019]) ) p

动态SQL如下所示

Select *
 From  YourTable
 Pivot (sum(amt) For [month] in ([3/2019],[4/2019],[5/2019]) ) p

假设您想要动态列。。。然后需要一点动态SQL

示例

Declare @SQL varchar(max) = '
Select *
 From YourTable
 Pivot (sum(amt) For [month] in (' + Stuff((Select Distinct ','+QuoteName(month) 
                                               From YourTable A  
                                               Order By 1 
                                               For XML Path('')),1,1,'')  + ') ) p'
Exec(@SQL);
--Print @SQL
返回

Select *
 From  YourTable
 Pivot (sum(amt) For [month] in ([3/2019],[4/2019],[5/2019]) ) p

动态SQL如下所示

Select *
 From  YourTable
 Pivot (sum(amt) For [month] in ([3/2019],[4/2019],[5/2019]) ) p

如果每一行都有唯一的行,则可以使用“最小”或“最大”进行伪聚合month@Vasya我认为在这种情况下,它们不会是唯一的,因为该列是“金额”。不,它们是每个“项目”和“月份”的唯一记录。例如,代码“aa”只有一行“4/2019”。除非您事先确切知道您将在哪个月之后,否则您可以查看此技巧,了解有关构建动态透视查询的一些想法:因此,我仔细研究了这些建议,意识到我还需要输出列,我提出了以下建议:这不是最优雅的解决方案,但是,它起作用了!谢谢大家!如果每一行都有唯一的行,则可以使用“最小”或“最大”进行伪聚合month@Vasya我认为在这种情况下,它们不会是唯一的,因为该列是“金额”。不,它们是每个“项目”和“月份”的唯一记录。例如,代码“aa”只有一行“4/2019”。除非您事先确切知道您将在哪个月之后,否则您可以查看此技巧,了解有关构建动态透视查询的一些想法:因此,我仔细研究了这些建议,意识到我还需要输出列,我提出了以下建议:这不是最优雅的解决方案,但是,它起作用了!谢谢大家!它们确实需要是动态的(每个月都会添加一个新的列)。这是我需要的一个很好的起点…这非常适合我的需要,因为我能够将它连接到存储过程中的另一个视图,以生成我的报表所需的结果集。谢谢大家!@当然可以。一种方法是构造第二个列名列表,该列表将生成…,[3/2019]=isnull([3/2019],0)。。。或者我更喜欢的技术是创建一个子查询,生成数据组合的交集。给我一些,我给你一个dbfiddle@EricBelair请注意带有UNION的src子查询ALL@EricBelair使用IsNull()的第二个选项它们确实需要是动态的(每个月都会添加一个新列)。这是我需要的一个很好的起点…这非常适合我的需要,因为我能够将它连接到存储过程中的另一个视图,以生成我的报表所需的结果集。谢谢大家!@当然可以。一种方法是构造第二个列名列表,该列表将生成…,[3/2019]=isnull([3/2019],0)。。。或者我更喜欢的技术是创建一个子查询,生成数据组合的交集。给我一些,我给你一个dbfiddle@EricBelair请注意带有UNION的src子查询ALL@EricBelair使用IsNull()的第二个选项