2016-12-12 7 views
0

私はピボット関数を使いこなしていましたが、私はそれが私が望むことをしているのか分かりません。私は、ストレージチケットが複数の要因と値を持つ親子関係を持っています。私は結果の数をあらかじめ定義された数に制限するのがとても嬉しいです。私はこの質問のために2つ一緒に行きます。SQL Serverの行数、行数の制限

ここでは、より簡単な結果セットを示します。そこFactorIdの可能性が多数あると、私は特定の各FactorIdにちなんで名付けられた列の作成に興味がないので

StorageTicketID FactorID FactorValue 
--------------------------------------- 
23    116  90 
23    210  13.2 

私は考えていないピボットが動作します。

これは私が思いついたものです。それは動作しますが、私はより良い方法があることを望んでいます!ここで

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 
+1

サンプル結果が表示されたサンプルデータを表示できますか? –

答えて

1

I簡単な条件の集約)行うことができますトリック

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 

戻り

StorageTicketID F1 V1  F2 V2 
23    116 90.00 210 13.20 

編集 - ちょうど楽しみのためには、私は、動的バージョンを追加したA

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'[email protected]+' 
From (
     Select *,RN=Row_Number() over (Partition By StorageTicketID Order By (Select NULL)) 
     From YourTable 
     ) A 
Group By StorageTicketID 
' 
Exec(@SQL); 
0

あなたが望むように濾過される派生テーブルの上にPIVOTを行うことができます。 ROW_NUMBER(と協力して

0

はジョンの入力に基づいて、私は参加を示すために役立つかもしれないと思ったとして、私はちょうどこれを掲示しています

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 

と一緒に行きました。