在SQL Server中使用数据透视功能

时间:2019-01-23 20:58:28

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

我有下表

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

1 个答案:

答案 0 :(得分: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。