SQL 服务器行成列,限制行数,
SQL Server rows into columns, limit rows,
我一直在摆弄枢轴函数,但我不确定它是否符合我的要求。我有一个父子关系,其中存储票可以有多个因素和值。我很乐意将结果数量限制为预定义的数量,这个问题我会选择两个。
这是一个更简单的结果集。
StorageTicketID FactorID FactorValue
---------------------------------------
23 116 90
23 210 13.2
我认为数据透视表行不通,因为 FactorId
有很多可能性,而且我对创建以每个特定 FactorId
.
命名的列不感兴趣
这是我想出的。它有效,但我希望有更好的方法!
select
StorageTicketID,
ROW_NUMBER() over (order by StorageTicketID) rownumber,
glfr.FactorID, glfr.FactorValue
into
#temp1
from
pgf_master.dbo.StorageTicket st
join
PGF_Master.dbo.GrainLoadFactorResult glfr on glfr.ParentID = st.StorageTicketID
and StorageTicketID = 23
and glfr.ParentTypeId = 2
select
max(StorageTicketID) ID,
(select factorid from #temp1
where rownumber = 1) F1,
(select factorvalue from #temp1
where rownumber = 1) V1,
(select factorid from #temp1
where rownumber = 2) F2,
(select factorvalue from #temp1
where rownumber = 2) V2
from
#temp1
group by
StorageTicketI
这是输出:
ID F1 V1 F2 V2
--------------------
23 116 90 210 13.2
您可以在派生的 table 上执行 PIVOT,并按照您想要的方式进行过滤。
我将简单的条件聚合与 Row_Number() 配合使用可能会成功
Select StorageTicketID
,F1 = max(case when RN=1 then FactorID else null end)
,V1 = max(case when RN=1 then FactorValue else null end)
,F2 = max(case when RN=2 then FactorID else null end)
,V2 = max(case when RN=2 then FactorValue else null end)
From (
Select *,RN=Row_Number() over (Partition By StorageTicketID Order By (Select NULL))
From YourTable
) A
Group By StorageTicketID
Returns
StorageTicketID F1 V1 F2 V2
23 116 90.00 210 13.20
Edit - Just for fun a I added a Dynamic version
Declare @SQL varchar(max) = (Select ',F'+RN+' = max(case when RN='+RN+' then FactorID else null end),V'+RN+' = max(case when RN='+RN+' then FactorValue else null end)' From (Select Distinct RN=cast(Row_Number() over (Partition By StorageTicketID Order By (Select null)) as varchar(15)) from YourTable) A Order by 1 For XML Path(''))
Select @SQL = '
Select StorageTicketID'+@SQL+'
From (
Select *,RN=Row_Number() over (Partition By StorageTicketID Order By (Select NULL))
From YourTable
) A
Group By StorageTicketID
'
Exec(@SQL);
根据约翰的意见,我选择了
Select StorageTicketID
,F1 = max(case when RN=1 then FactorID else null end)
,V1 = max(case when RN=1 then FactorValue else null end)
,F2 = max(case when RN=2 then FactorID else null end)
,V2 = max(case when RN=2 then FactorValue else null end)
From (
Select st.StorageTicketID,glfr.FactorID, glfr.FactorValue,RN=Row_Number() over (Partition By StorageTicketID Order By (Select NULL))
From storageticket st
join GrainLoadFactorResult glfr on st.StorageTicketID = glfr.ParentID
) A
Group By StorageTicketID
我只是发布这个,因为我认为它可能有助于显示连接。
我一直在摆弄枢轴函数,但我不确定它是否符合我的要求。我有一个父子关系,其中存储票可以有多个因素和值。我很乐意将结果数量限制为预定义的数量,这个问题我会选择两个。
这是一个更简单的结果集。
StorageTicketID FactorID FactorValue
---------------------------------------
23 116 90
23 210 13.2
我认为数据透视表行不通,因为 FactorId
有很多可能性,而且我对创建以每个特定 FactorId
.
这是我想出的。它有效,但我希望有更好的方法!
select
StorageTicketID,
ROW_NUMBER() over (order by StorageTicketID) rownumber,
glfr.FactorID, glfr.FactorValue
into
#temp1
from
pgf_master.dbo.StorageTicket st
join
PGF_Master.dbo.GrainLoadFactorResult glfr on glfr.ParentID = st.StorageTicketID
and StorageTicketID = 23
and glfr.ParentTypeId = 2
select
max(StorageTicketID) ID,
(select factorid from #temp1
where rownumber = 1) F1,
(select factorvalue from #temp1
where rownumber = 1) V1,
(select factorid from #temp1
where rownumber = 2) F2,
(select factorvalue from #temp1
where rownumber = 2) V2
from
#temp1
group by
StorageTicketI
这是输出:
ID F1 V1 F2 V2
--------------------
23 116 90 210 13.2
您可以在派生的 table 上执行 PIVOT,并按照您想要的方式进行过滤。
我将简单的条件聚合与 Row_Number() 配合使用可能会成功
Select StorageTicketID
,F1 = max(case when RN=1 then FactorID else null end)
,V1 = max(case when RN=1 then FactorValue else null end)
,F2 = max(case when RN=2 then FactorID else null end)
,V2 = max(case when RN=2 then FactorValue else null end)
From (
Select *,RN=Row_Number() over (Partition By StorageTicketID Order By (Select NULL))
From YourTable
) A
Group By StorageTicketID
Returns
StorageTicketID F1 V1 F2 V2
23 116 90.00 210 13.20
Edit - Just for fun a I added a Dynamic version
Declare @SQL varchar(max) = (Select ',F'+RN+' = max(case when RN='+RN+' then FactorID else null end),V'+RN+' = max(case when RN='+RN+' then FactorValue else null end)' From (Select Distinct RN=cast(Row_Number() over (Partition By StorageTicketID Order By (Select null)) as varchar(15)) from YourTable) A Order by 1 For XML Path(''))
Select @SQL = '
Select StorageTicketID'+@SQL+'
From (
Select *,RN=Row_Number() over (Partition By StorageTicketID Order By (Select NULL))
From YourTable
) A
Group By StorageTicketID
'
Exec(@SQL);
根据约翰的意见,我选择了
Select StorageTicketID
,F1 = max(case when RN=1 then FactorID else null end)
,V1 = max(case when RN=1 then FactorValue else null end)
,F2 = max(case when RN=2 then FactorID else null end)
,V2 = max(case when RN=2 then FactorValue else null end)
From (
Select st.StorageTicketID,glfr.FactorID, glfr.FactorValue,RN=Row_Number() over (Partition By StorageTicketID Order By (Select NULL))
From storageticket st
join GrainLoadFactorResult glfr on st.StorageTicketID = glfr.ParentID
) A
Group By StorageTicketID
我只是发布这个,因为我认为它可能有助于显示连接。