【问题标题】:How to pivot rows to data with T-SQL?如何使用 T-SQL 将行转换为数据?
【发布时间】:2019-04-16 23:25:14
【问题描述】:

我有以下数据:

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

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

【问题讨论】:

  • 如果每个月都有唯一的行,您可以使用 MIN 或 MAX 进行伪聚合
  • @Vasya 我认为在这种情况下它们不会是唯一的,因为该列是“金额”。
  • 不,它们是每个“项目”和“月”的唯一记录。例如,代码“aa”只有一个“4/2019”行。
  • 除非您提前确切知道您要经过哪几个月,否则您可以查看此提示以了解有关构建动态数据透视查询的一些想法:mssqltips.com/sqlservertip/2783/…
  • 所以,我浏览了这些建议并意识到我还需要输出列,我想出了这个:dbfiddle.uk/… 不是最优雅的解决方案,但是,它有效!谢谢大家!

标签: sql-server tsql pivot


【解决方案1】:

假设您需要动态列...那么您将需要一些动态 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

退货

动态 SQL 如下所示

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

【讨论】:

  • 它们确实需要是动态的(每个月都会添加一个新列)。这是我需要的一个很好的起点......
  • 这非常适合我的需求,因为我能够将它加入到存储过程中的另一个视图中,以生成我的报告所需的结果集。谢谢!
  • @EricBelair 当然可以。一种方法是构造第二个列名列表,它会产生 ..., [3/2019] = isnull([3/2019],0) ... 或者我的首选技术是创建一个子查询,它会生成一个数据组合的交集。给我一些,我创建给你一个 dbfiddle
  • @EricBelair 看看dbfiddle.uk/… 注意带有 UNION ALL 的 src 子查询
  • @EricBelair 第二个选项使用 IsNull() dbfiddle.uk/…
【解决方案2】:

有一个pivot函数可以直接在T-sql中使用,试试这个 https://docs.microsoft.com/en-us/sql/t-sql/queries/from-using-pivot-and-unpivot?view=sql-server-2017

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-10
    • 2022-09-27
    • 1970-01-01
    • 1970-01-01
    • 2018-05-06
    • 2017-05-20
    • 2020-11-19
    • 1970-01-01
    相关资源
    最近更新 更多