iT邦幫忙

0

SQL 列 轉換

https://ithelp.ithome.com.tw/upload/images/20210721/20061726Jv71nVuFEu.png
請問 一下 各位前輩高手 SQL 列怎麼轉換 如圖
單號 品名 品號
540120200818005 A1 CZ0017011
540120200818005 B1 DBB4031301
540120200818005 C1 DCA4031303
540120200818006 D1 CZ0017011
540120200818006 F1 DBB4031302
540120200818006 A2 DCA4031304

我想變成 像下面這樣
單號 品名 品號 品名 品號 品名 品號
540120200818005 A1 CZ0017011 B1 DBB4031301 C1 DCA4031303
540120200818006 A2 CZ0017011 D1 DBB4031302 F1 DCA4031304

rogeryao iT邦大師 1 級 ‧ 2021-07-21 12:58:07 檢舉
540120200818006
原始資料
D1 = > CZ0017011
F1= > DBB4031302
A2 = > DCA4031304

結果變成
A2 = > CZ0017011
D1 = > DBB4031302
F1 = > DCA4031304

邏輯是什麼 ?
變橫向的表對嗎?
loveotgi iT邦新手 5 級 ‧ 2021-07-22 07:55:20 檢舉
對,複製貼上錯了,哈哈 不好意思

2 個回答

0
allenlwh
iT邦高手 1 級 ‧ 2021-07-21 13:20:31

可以使用 PIVOT
使用 PIVOT 和 UNPIVOT

loveotgi iT邦新手 5 級 ‧ 2021-07-22 07:54:04 檢舉

謝謝

0
純真的人
iT邦大師 2 級 ‧ 2021-07-21 13:21:16

你參考~動態欄位~直轉換橫~
MSSQL
T-SQL語法

declare @Tmp table(
	單號  nvarchar(50)
	,品名 nvarchar(50)
	,品號 nvarchar(50)
)

insert into @Tmp
values('540120200818005','A1','CZ0017011')
,('540120200818005','B1','DBB4031301')
,('540120200818005','C1','DCA4031303')
,('540120200818006','D1','CZ0017011')
,('540120200818006','F1','DBB4031302')
,('540120200818006','A2','DCA4031304')
,('540120200818006','A4','DCA4031305')

declare @Max_Count int =0
select top 1 @Max_Count=count(0)
from @Tmp
group by 單號
order by count(0) desc

declare @i int = 0,@count int = 0
declare @j int = 0,@Sub_count int = 0
declare @k int = 0,@Table nvarchar(max)=''
declare @單號 nvarchar(50),@品名 nvarchar(50),@品號 nvarchar(50)
select @count=count(0)
from (
	select 單號
	from @Tmp
	group by 單號
) k

set @Table = 'select * '
set @Table = @Table + ' from (('
while(@i<@count)
begin
	set @i = @i + 1
	select @單號=單號
	from (
		select Row_Number()Over(order by 單號) Sort
		,單號
		from @Tmp
		group by 單號
	) k
	where Sort = @i

	if(@i>1)
	begin
		set @Table = @Table + ')union all('
	end
	set @Table = @Table + ' select '
	set @Table = @Table + '''' + @單號 + ''' 單號 '

	set @j = 0
	set @k = 0

	select @Sub_count=count(0)
	from @Tmp
	where 單號 = @單號

	while(@j<@Max_Count)
	begin
		set @j = @j + 1

		set @品名 = ''
		set @品號 = ''

		select @品名=品名
		,@品號=品號
		from (
			select Row_Number()Over(order by 品名) Sort
			,*
			from @Tmp
			where 單號 = @單號
		) k
		where Sort = @j

		set @Table = @Table + ',N''' + @品名 + '''  品名' + Convert(varchar,@j) + ', N''' + @品號 + ''' 品號' + Convert(varchar,@j)

	end
end
set @Table = @Table + ' )) k'

--print @Table
EXEC (@Table);

https://ithelp.ithome.com.tw/upload/images/20210721/20061369AxfNSttO57.png

loveotgi iT邦新手 5 級 ‧ 2021-07-22 07:53:37 檢舉

謝謝大大

我要發表回答

立即登入回答