【问题标题】:Using Pivot function In SQL Server在 SQL Server 中使用透视函数
【发布时间】:2019-03-18 05:51:09
【问题描述】:

我有下表

Code            Data
SL Payroll       1
GV Payroll       3
Global Payroll   1
TimeHCM          1
SL Payroll       0
GV Payroll       0
Global Payroll  0
TimeHCM          0
SL Payroll       0
GV Payroll       0
Global Payroll   0
TimeHCM          0

我正在使用数据透视函数来展平数据

Select *
  From (
        Select [Code]
              ,[Data]
              ,[Col] = concat('Data',Row_Number() over (Partition By [Code] Order by 1/0))
         From  #BidStatusCalculation
       ) src
 Pivot (max([Data]) for [Col] in ([Data1],[Data2],[Data3],[Data4],[Data5],[Data6],[Data7],[Data8],[Data9],[Data10],[Data11],[Data12])) pvt

我得到以下结果

Code           Month1   Month2   Month3
GV Payroll      0        0        **3** 

问题是它正在从下往上转置数据,这意味着它会获取它找到的第一条记录并使其成为最后一条记录,我希望它如下所示

Code           Month1   Month2   Month3
GV Payroll      **3**       0        0

我应该对查询进行哪些更改?

更新我按照建议添加了 SortOrder 列,现在表格如下所示。

Code            Data    SortOrder
    SL Payroll       1     1
    GV Payroll       3     2
    Global Payroll   1     3
    TimeHCM          1     4
    SL Payroll       0      1
    GV Payroll       0      2
    Global Payroll  0      3
    TimeHCM          0     4
    SL Payroll       0     ....
    GV Payroll       0
    Global Payroll   0
    TimeHCM          0

【问题讨论】:

  • 是的,我是这么说的。添加一个身份或可以用来对它们进行排序的东西。如果您有订购能力,那么这很简单。但是为每个组设置列而不是行会好一百万倍。
  • 如果你不使用order by,看看为什么your data isn't ordered。另外,来自Aaron Bertrand in this answer
  • @scsimon 太棒了!!!多年来,我一直在链接到康纳坎宁安的那篇文章。仅仅几天,它就从 MS 中删除了。他告诉我他会尝试恢复它。从来没有想过使用回程机。你今天赢得了互联网!!!
  • 哈哈感谢@SeanLange 并寻找它让我更快地找到了 Aaron 的答案。不知道他们为什么删除它......我敢打赌谷歌分析它被链接了多少次。
  • 发布一些代码而不是“我添加了订购者”怎么样?我宁愿首先使用条件聚合而不是枢轴来做这种事情。发布一些消耗性数据,我很乐意向您展示它是如何工作的。

标签: sql sql-server sql-server-2008


【解决方案1】:

这是您的子查询:

    Select [Code], [Data],
           [Col] = concat('Data', Row_Number() over (Partition By [Code] Order by 1/0))
     From #BidStatusCalculation

order by 1/0 是一个非常奇怪的结构。相当于:order by (select null)。也就是说,没有排序。

嗯,你有问题。表,甚至是临时表,都代表 SQL 中的 无序 集。如果您的结果依赖于表格的某些先天排序,那么您就不走运了。 SQL 不这样做。

您需要一个指定排序的列——大概是某种日期列或 ID。

【讨论】:

  • 嗨,戈登..是的,其他人建议在上面的 cmets 中,它现在工作正常。感谢您的回复。
猜你喜欢
  • 2018-01-07
  • 1970-01-01
  • 1970-01-01
  • 2013-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多