代码之家  ›  专栏  ›  技术社区  ›  SP1

在SQL Server中使用透视函数

  •  -1
  • SP1  · 技术社区  · 6 年前

    我有下表

    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
    

    我正在使用Pivot函数将数据展平

    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 回复  |  直到 6 年前
        1
  •  1
  •   Gordon Linoff    6 年前

    这是您的子查询:

        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。