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

我只是发布这个,因为我认为它可能有助于显示连接。