台灣最大程式設計社群網站
線上人數
1923
 
會員總數:246228
討論主題:189787
歡迎您免費加入會員
討論區列表 >> MS SQL >> 資料分割問題請教
[]  
[我要回覆]
1
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
資料分割問題請教
價值 : 100 QP  點閱數:812 回應數:9
樓主

alice
門外漢
0 1
558 3
發送站內信

資料為
id name
---------
01 A
02 B
03 C
04 D
05 E
請教先進,該如何才能以3筆去切成以下結果
id name id2 name2
---------------------
01 A 04 D
02 B 05 E
03 C

搜尋相關Tags的文章: [ 資料分割 ] ,
本篇文章發表於2015-10-29 20:47
1樓
select 5.0/3.0

select ceiling(1.66666)

sql for 迴圈組字串 建table

sql for 迴圈塞資料

本篇文章回覆於2015-10-29 22:36
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
2樓
作者回應

alice
檢舉此回應
謝謝,請問sql for 迴圈組字串 建table這裡要怎麼寫呢
本篇文章回覆於2015-10-29 23:25
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
3樓

create table #rep(id nvarchar(50) primary key,
name nvarchar(50) null)

insert #rep
select '01','A'

insert #rep
select '02','B'

insert #rep
select '03','C'

insert #rep
select '04','D'

insert #rep
select '05','E'


DECLARE @i INT
DECLARE @MAX INT
SET @i = 0
SET @MAX = (select ceiling(1.66666))
WHILE (@i<@MAX)
BEGIN
select @i
Set @i=@i+1
END

create table 你會吧?
insert 資料你會吧!?
本篇文章回覆於2015-10-30 11:50
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
4樓
作者回應

alice
檢舉此回應
您好
資料寫入#table,這個部份我會
您所說的sql for 迴圈組字串 建table,是否是要動態建立?
例如資料筆數是7筆時,判斷新增所需要的column數,這個地方我比較不懂如何處理

本篇文章回覆於2015-10-30 12:29
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
5樓
建table的我幫你寫 塞資料的你自己來吧!

alter procedure usp_tb
as
declare @資料筆數 numeric(18,2)=(select count(*) from #rep)
declare @套數 numeric(18,2)=3
declare @迴圈數 int =(select ceiling(@資料筆數/@套數))
declare @ctb nvarchar(200)=''
DECLARE @i INT
DECLARE @MAX INT
SET @i = 0
SET @MAX = @迴圈數
WHILE (@i<@MAX)
BEGIN
set @ctb+='id'+convert(varchar(2),@i)+' nvarchar(50),name'+convert(varchar(2),@i)+' nvarchar(50),'
Set @i=@i+1
END
declare @ctbsql nvarchar(2000)='create table repxx( '+left(@ctb,len(@ctb)-1)+')'
execute(@ctbsql)
本篇文章回覆於2015-10-30 15:24
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
6樓
最有價值解答

真的有點難
檢舉此回應
好啦 我好人做到底

--資料來源

create table #rep(id nvarchar(50) primary key,
name nvarchar(50) null)
insert #rep
select '01','A'
insert #rep
select '02','B'
insert #rep
select '03','C'
insert #rep
select '04','D'
insert #rep
select '05','E'

--建立table

create procedure usp_tb
as
declare @資料筆數 numeric(18,2)=(select count(*) from #rep)
declare @套數 numeric(18,2)=3
declare @迴圈數 int =(select ceiling(@資料筆數/@套數))
declare @ctb nvarchar(200)=''
DECLARE @i INT
DECLARE @MAX INT
SET @i = 0
SET @MAX = @迴圈數
WHILE (@i<@MAX)
BEGIN
set @ctb+='id'+convert(varchar(2),@i)+' nvarchar(50),name'+convert(varchar(2),@i)+' nvarchar(50),'
Set @i=@i+1
END
declare @ctbsql nvarchar(2000)='create table repxx( '+left(@ctb,len(@ctb)-1)+')'
execute(@ctbsql)

--新增一個自動編號的欄位
alter table repxx add sn int identity(1,1) primary key

--塞資料
select sn=identity(int,1,1),id,name into #rep2 from #rep
--select * from #rep2

create procedure usp_ins
as

DECLARE @i INT
DECLARE @MAX INT
SET @i = 1
SET @MAX = (select count(*) from #rep2)
WHILE (@i<=@MAX)
BEGIN
declare @id nvarchar(50)=''
declare @name nvarchar(50)=''
declare @ins nvarchar(2000)=''
declare @insid nvarchar(50)=''
declare @updid nvarchar(50)=''
declare @upd nvarchar(2000)=''

select @id=id,@name=name from #rep2 where sn=@i

if @i % 3=0
begin
set @updid='3'
set @insid= convert(nvarchar(2),(@i/3)-1)
end
else
begin
set @insid= convert(nvarchar(2),(@i/3))
end

if @i<=3
begin
set @ins='insert repxx(id'+@insid+',name'+@insid+')'
set @ins+=' select '''+@id+''','''+@name+''''
execute(@ins)
end
if @i>3
begin
set @updid=@i%3
select @id=id,@name=name from #rep2 where sn=@i
set @upd='update repxx set id'+@insid+'='''+@id+''',name'+@insid+'='''+@name+''' where sn='''+@updid+''''

execute(@upd)
end

Set @i=@i+1
END

select * from repxx
本篇文章回覆於2015-10-30 17:10
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
7樓
作者回應

alice
檢舉此回應
謝謝您
今天下午我用固定兩欄的方式寫出來了,方式雷同您寫入的方式
動態建table的部份我再試看看
本篇文章回覆於2015-10-30 21:32
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
8樓
回應

Hsu,Harry
檢舉此回應
這一組SQL就可以完成, 沒必要使用Stored Procedure啊。
本篇文章回覆於2015-10-31 10:23
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
9樓
poocedure 可以使用alt+x的方便性
本篇文章回覆於2015-10-31 12:41
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
   
1

回覆
如要回應,請先登入.