2

SQL Server 2012 を使用しています。次の出力を得るには助けが必要です。私のテーブル構造は次のとおりです。

declare @TestTable table (MaterialCode char(5), ItemCode char(5), ItemName varchar(50))

insert into @TestTable values ('AA-01', 'A0001', 'iPhone')
insert into @TestTable values ('AA-02', 'A0001', 'iPad')
insert into @TestTable values ('AA-03', 'A0001', 'iPod')

insert into @TestTable values ('AA-01', 'B0001', 'Galaxy Tab')
insert into @TestTable values ('AA-02', 'B0001', 'Galaxy Note')

insert into @TestTable values ('AA-01', 'C0001', 'Nokia Lumnia')
insert into @TestTable values ('AA-02', 'C0001', 'Motorola')
insert into @TestTable values ('AA-03', 'C0001', 'Samsung S3')
insert into @TestTable values ('AA-04', 'C0001', 'Sony')

--select * from @TestTable

select MaterialCode, ItemCode as [A_ItemCode], ItemName as [A_ItemName] 
from @TestTable where ItemCode='A0001'

select MaterialCode, ItemCode as [B_ItemCode], ItemName as [B_ItemName] 
from @TestTable where ItemCode='B0001'

select MaterialCode, ItemCode as [C_ItemCode], ItemName as [C_ItemName] 
from @TestTable where ItemCode='C0001'

そして、必要な出力は、上記の 3 つの選択ステートメントから生成される必要があります。これは次のようになります。

ここに画像の説明を入力

ご覧のとおり、レコードがない場合は NULL が表示されます。誰でもこの出力を得るのを手伝ってくれますか? ティア。

編集

@JohnLBevan、ピボットアプローチを試してみましたが、ItemCode = D0001 を持つ別のレコードがある場合

insert into @TestTable values ('AA-05', 'D0001', 'Test1')

現在、そのレコードでさえ次のように表示されています

AA-05   NULL    NULL    NULL    NULL    NULL    NULL

これらのタイプのレコードを回避する方法。

4

1 に答える 1

3

ピボットを使用していませんが、これにより望ましい結果が得られます。

SELECT coalesce(a.MaterialCode, b.MaterialCode, c.MaterialCode) MaterialCode 
, a.ItemCode A_ItemCode
, a.ItemName A_ItemName
, b.ItemCode B_ItemCode
, b.ItemName B_ItemName
, c.ItemCode C_ItemCode
, c.ItemName C_ItemName
FROM (select * from @TestTable where ItemCode='A0001') a
full outer join (select * from @TestTable where ItemCode='B0001') b
    on a.MaterialCode = b.MaterialCode
full outer join (select * from @TestTable where ItemCode='C0001') c
    on a.MaterialCode = c.MaterialCode
    or b.MaterialCode = c.MaterialCode

ピボットを使用する別の方法を次に示しますが、これは面倒に感じます。

SELECT MaterialCode
, case when [A0001] is null then null else 'A0001' end A_ItemCode
, [A0001] A_ItemName
, case when [A0001] is null then null else 'B0001' end B_ItemCode
, [B0001] B_ItemName
, case when [A0001] is null then null else 'C0001' end C_ItemCode
, [C0001] C_ItemName
FROM @TestTable a
pivot (
    max(ItemName) 
    for ItemCode in ([A0001],[B0001],[C0001])
) pvt

編集

もう少し柔軟なものが必要な場合は、動的バージョンを次に示します。

declare @dynamicSql nvarchar(max)
, @dynamicSqlPart nvarchar(max)

select * into #TestTable from @TestTable

set @dynamicSql = 'SELECT MaterialCode ' + CHAR(10)
select @dynamicSql = @dynamicSql + ', case when [' + ItemCode + '] is null then null else ''' + ItemCode + ''' end ' + ItemCode + '_ItemCode ' + CHAR(10)
    + ', ' + QUOTENAME(ItemCode) + ' ' + ItemCode + '_ItemName ' + CHAR(10)
, @dynamicSqlPart = ISNULL(@dynamicSqlPart + ',','') +  QUOTENAME(ItemCode)
from (select distinct ItemCode from @TestTable) x

set @dynamicSql = @dynamicSql + 'from #TestTable a' + CHAR(10)
    + 'pivot (' + CHAR(10)
    + ' max(ItemName) ' + CHAR(10)
    + ' for ItemCode in (' + @dynamicSqlPart + ')' + CHAR(10)
    + ') pvt' + CHAR(10)

print isnull(@dynamicSql,'?')
exec (@dynamicSql)

drop table #TestTable
于 2012-11-08T08:43:23.883 に答える