2016-04-06 9 views
0

レコードをグループ化してピボットするにはどうすればいいですか?以下のレコードを取得するために SQLクエリは以下の通りです:テーブルレコードをピボットするには?

select d.Name as DrawerBox 
    , dt.Name as DrawerBoxType 
    , di.Inches as Inches 
    , isnull(dbc.Value, dc.Value) Value  
from DrawerBox_C dc 
join DrawerBox d 
    on d.DrawerBoxId = dc.DrawerBoxId 
join DrawerBoxInches di 
    on di.DrawerBoxInchesId = dc.DrawerBoxInchesId 
join DrawerBoxType dt 
    on dt.DrawerBoxTypeId = dc.DrawerBoxTypeId 
left join dbo.DrawerBox_Bid_C dbc 
    on dbc.DrawerBox_C_Id = dc.DrawerBox_C_Id 
    and dbc.BidId = 1 

enter image description here

形式

enter image description here

以下、このように出力したい事前

+0

オプションの数は何ですか? – sagi

+0

5インチ12インチ、18インチ、24インチ、30インチ、36インチ –

+1

GROUP BYを実行し、インチオプションごとにケース式を使用します。 – jarlh

答えて

1

のおかげで、それに打撃を与えますこのように...クエリはテストされていませんが、失敗すると私に知らせることができますので、修正することができます...しかし、あなたが望むものは、ちょうどピボットが必要です

select * from (
select d.Name as DrawerBox 
, dt.Name as DrawerBoxType 
, di.Inches as Inches 
, isnull(dbc.Value, dc.Value) Value  
from DrawerBox_C dc 
    join DrawerBox d 
     on d.DrawerBoxId = dc.DrawerBoxId 
    join DrawerBoxInches di 
     on di.DrawerBoxInchesId = dc.DrawerBoxInchesId 
    join DrawerBoxType dt 
     on dt.DrawerBoxTypeId = dc.DrawerBoxTypeId 
    left join dbo.DrawerBox_Bid_C dbc 
     on dbc.DrawerBox_C_Id = dc.DrawerBox_C_Id 
     and dbc.BidId = 1 
) src 
    PIVOT 
    (
    Max(value) 
    for Inches in ([12], [18], [24], [30], [36]) 
) piv 
order by DrawerBox, DrawerBoxType 
-1

以下を使用して、クエリを動的に実行することができます。つまり、新しい「インチ」の値を追加しても自動的に作成されます。あなたがテストできるように、以下のマニュアルインサートも提供されています。また、各DrawerBox/DrawerBoxTypeの最大「値」を取得していることにも注意してください。必要に応じて、「平均」、「最小」、「合計」を使用することもできます。

Drop Table #PivotRecs 
Create Table #PivotRecs (DrawerBox nvarchar(200), DrawerBoxType nvarchar(200), Inches int, Value int) 
Insert Into #PivotRecs 
select d.Name as DrawerBox 
    , dt.Name as DrawerBoxType 
    , di.Inches as Inches 
    , isnull(dbc.Value, dc.Value) Value  
from DrawerBox_C dc 
join DrawerBox d 
    on d.DrawerBoxId = dc.DrawerBoxId 
join DrawerBoxInches di 
    on di.DrawerBoxInchesId = dc.DrawerBoxInchesId 
join DrawerBoxType dt 
    on dt.DrawerBoxTypeId = dc.DrawerBoxTypeId 
left join dbo.DrawerBox_Bid_C dbc 
    on dbc.DrawerBox_C_Id = dc.DrawerBox_C_Id 
    and dbc.BidId = 1 


    --Insert Into #PivotRecs 
    --Select 'Melamine', 'Standard', 12, 3 Union 
    --Select 'Melamine', 'Standard', 18, 6 Union 
    --Select 'Melamine', 'Standard', 24, 9 Union 
    --Select 'Melamine', 'Standard', 30, 12 Union 
    --Select 'Melamine', 'Standard', 36, 15 Union 
    --Select 'Melamine', 'File', 12, 5 Union 
    --Select 'Melamine', 'File', 18, 8 Union 
    --Select 'Melamine', 'File', 24, 11 Union 
    --Select 'Melamine', 'File', 30, 14 Union 
    --Select 'Melamine', 'File', 36, 17 


Declare @Inch int, @SQL nvarchar(max),@Inchs nvarchar(max),@SQL2 nvarchar(max), @i int 
Set @i = 0 
Set @SQL = '' 
Set @SQL2 = '' 
Set @Inchs = '' 
DECLARE iCursor CURSOR 
LOCAL 
FAST_FORWARD 
FOR 
Select Distinct Inches From #PivotRecs Order By Inches 
    OPEN iCursor 
FETCH NEXT FROM iCursor INTO @Inch 
WHILE (@@fetch_status <> -1) 
BEGIN 
If(@i=1) 
Begin 
Set @SQL = @SQL + ',['+Cast(@Inch as nvarchar(4))+']' 
Set @Inchs= @Inchs + ','+Cast(@Inch as nvarchar(4))+'' 
End 
If(@i=0) 
Begin 
Set @SQL = @SQL + '['+Cast(@Inch as nvarchar(4))+']' 
Set @Inchs = @Inchs + ''+Cast(@Inch as nvarchar(4))+'' 
Set @i = 1 
End 

FETCH NEXT FROM iCursor INTO @Inch 
Continue 
End 
Set @SQL2 = 
'Select * 
From 
(Select Distinct DrawerBox, DrawerBoxType, Inches, Value From #PivotRecs) a 
pivot (
    max (a.Value) 
    for Inches in ('[email protected]+')) 
    as Inches 
    Order By 1' 

Exec SP_ExecuteSQL @SQL2 
関連する問題