在 SQL 服务器中使用 Pivot 函数
Using Pivot function In SQL Server
我有以下table
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 列,现在 table 如下所示。
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
这是您的子查询:
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)
。也就是没有排序。
嗯,你有问题。表,甚至是临时的 tables,表示 SQL 中的 无序 集。如果您的结果依赖于 table 的某些先天排序,那么您就不走运了。 SQL 不会那样做。
您需要一个指定排序的列 -- 可能是某种日期列或 ID。
我有以下table
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 列,现在 table 如下所示。
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
这是您的子查询:
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)
。也就是没有排序。
嗯,你有问题。表,甚至是临时的 tables,表示 SQL 中的 无序 集。如果您的结果依赖于 table 的某些先天排序,那么您就不走运了。 SQL 不会那样做。
您需要一个指定排序的列 -- 可能是某种日期列或 ID。