Ⅰ 請教一個將行轉換成列的問題,用sql語言如何實現,存儲過程也行
你的條件要求有點亂,看不大明白了,但是行轉列的例子我可以給你看個,可以看著改改就行
if object_id('pubs..tb') is not null
drop table tb
go
create table tb
(
ID int,
VALUE varchar(10)
)
insert into tb(ID,VALUE) values(1,'A')
insert into tb(ID,VALUE) values(2,'B')
insert into tb(ID,VALUE) values(3,'C')
insert into tb(ID,VALUE) values(4,'D')
insert into tb(ID,VALUE) values(5,'E' )
declare @sql varchar(8000)
set @sql = 'select '''
select @sql=@sql+VALUE from (select top 3 VALUE from tb order by newid())tc
select @sql=@sql+''''
exec(@sql)
drop table tb
Ⅱ sql語句行轉列 怎麼轉啊
--聲明變數
declare@sqlvarchar(1000),@num_dataint,@num_allvarchar(2000),@num_numint,@table_sqlvarchar(2000)
set@num_num=0
--判斷並創建表
ifexists(select*fromdbo.sysobjectswhereid=object_id(N'[dbo].[records]')andOBJECTPROPERTY(id,N'IsUserTable')=1)
droptable[dbo].[records]
createtablerecords(
[id]int,
[name]varchar(50),
[sex]varchar(10),
[num]int
)
--插入數據
insertintorecordsvalues(1,'tom','男',2)
insertintorecordsvalues(1,'tom','男',3)
insertintorecordsvalues(1,'tom','男',4)
insertintorecordsvalues(1,'tom','男',5)
--全選表中數據
select*fromrecords
--全選num列數據
selectnumas'數據'fromrecords
--釋放游標
deallocateselect_num
--為『selectnumfromrecords』建立游標
declareselect_numscrollcursorforselectnumas'shuju'fromrecords
--打開游標
openselect_num
--獲得第一條數據
fetchnextfromselect_numinto@num_data
set@num_all=convert(varchar,@num_data)+','
set@num_num=@num_num+1;
--如果獲取成功,繼續獲得數據
while@@fetch_status=0
begin
fetchnextfromselect_numinto@num_data
set@num_num=@num_num+1;
set@num_all=@num_all+convert(varchar,@num_data)+','
end
--關閉游標
closeselect_num
print@num_num
--set@num_num=@num_num-1;
declare@iint
set@i=1
print@num_num
print@i
set@table_sql='createtablenumall(idint,namevarchar(50),sexvarchar(10)'
print@table_sql
while@num_num>=1
begin
set@table_sql=@table_sql+',num'+convert(varchar,@i)+'int'
set@num_num=@num_num-1;
set@i=@i+1
end
set@table_sql=@table_sql+')'
print@table_sql
ifexists(select*fromdbo.sysobjectswhereid=object_id(N'[dbo].[numall]')andOBJECTPROPERTY(id,N'IsUserTable')=1)
droptable[dbo].[numall]
exec(@table_sql)
declare@insert_sqlvarchar(2000)
set@insert_sql='insertintonumallvalues(1,'+'''tom'','+'''男'''
print@insert_sql
openselect_num
--獲得第一條數據
fetchnextfromselect_numinto@num_data
set@insert_sql=@insert_sql+','+convert(varchar,@num_data)
--如果獲取成功,繼續獲得數據
while@@fetch_status=0
begin
fetchnextfromselect_numinto@num_data
set@insert_sql=@insert_sql+','+convert(varchar,@num_data)
end
set@insert_sql=@insert_sql+')'
print@insert_sql
exec(@insert_sql)
--insertintonumallvalues(1,'tom','男',2,3,4,5,5)
select*fromnumall
試試吧,數據雖然有點出入,但已經說明問題了!!!
Ⅲ sql 動態行轉列只能寫存儲過程嗎
如果使用的頻率不高,可以不用寫成存儲過程,定義個臨時變數執行下
如果使用頻率高還是用存儲過程把,sql代碼涉及字元串拼接,建議用存儲過程封裝起來好。
Ⅳ oracle行轉列寫法,麻煩大家幫忙寫個sql,謝謝
可以用wm_concat函數先把數據變成行顯示,然後再通過截取來顯示具體的月份,wm_concat轉換如下
selectcompay_namecn,wm_concat(income)ic
from(selectcompay_name,sum(income)income,substr(time,1,6)time
fromincome
---wheretime>=start_monthandtime<=end_month
groupbycompay_name,substr(time,1,6)
orderbycompay_name,substr(time,1,6))
groupbycompay_name;
Ⅳ 資料庫SQL實現行轉列。請懂的人幫忙,謝謝!
沒有環境,試試下面語句可否實現(oracle):
select Customer.CustomerId,
Customer.CustomerName
wm.concat(Phone.PhoneNumber)
from Customer left join
(
select CustomerPhone.CustomerId,
Phone.PhoneNumber
from CustomerPhone inner join Phone on CustomerPhone.PhoneId=Phone.PhoneId
order by CustomerPhone.CustomerId
)Phone on Customer.CustomerId=Phone.CustomerId
Ⅵ 動態錶行轉列怎麼實現,SQL語句或存儲過程都可以。求指教。
可以使用動態行列轉換,先拼出相關的sql語句的字元串,再用exec 來執行。
Ⅶ SQL2008 存儲過程行列轉換
ALTERPROC[dbo].[Report_Sale_JXS_HFgongdan]
(@BeginDateDatetime
,@EndDatedatetime
,@Name1VARCHAR(50)
,@Name2VARCHAR(50))
AS
BEGIN
if@EndDate<='2010-01-01'
begin
select@EndDate=GETDATE()
end
SELECT
T0.CARDNAMEAS'客戶名稱',T0.CARDPHONEAS'客戶電話',T0.VINAS'車架號',T0.MNameAS'車型描述'
,T4.OColorNameAS'車身顏色',T0.NoteAS'備注',T0.JYNoteAS'建議',T6.U001AS'事業部',T4.CmpCodeAS'經銷商編號'
,T0.SaleNameAS'經銷商名稱',T0.SalePhoneAS'經銷商電話',CONVERT(VARCHAR(10),T0.DocDay,23)AS'來電日期'
--,T3.L1DESCAS'問題'
--,T3.L1AnswerAS'回答'
--,T3.L1ScoreAS'得分'
,MAX(CASEWHENT3.L1DESC='XXX問題'THENT3.L1AnswerEND)AS'XXX問題的回答'
--所有問題按上面那樣子寫出來
,MAX(CASEWHENT3.L1DESC='XXX問題'THENT3.L1ScoreEND)AS'XXX問題的得分'
--所有問題按上面那樣子寫出來
,T0.[Status]AS'回訪狀態',T0.DocTotalAS'綜合得分',T0.HFTypeNameAS'回訪類型',T2.userNameAS'回訪人員'
,casewhenT0.IsHFCG='1'then'是'
whenT0.IsHFCG='0'then'否'endAS'是否成功'
,casewhenT0.IsClose='1'then'是'
whenISNULL(T0.IsClose,0)='0'then'否'endas'是否結束'
FROMdmsSaleHFDJT0
innerJOINdmsSaleHFLXT1ONT0.HFTypeName=T1.[DESC]
innerjoindmsBaseUserT2onT0.HFPsnName=T2.userName
innerjOINdmssaleHFDJ1T3ONT3.ID=T0.ID
INNERjoindmsSaleOCarT4onT4.VIN=T0.VIN
innerjoindmsBaseUserT5onT5.userCode=T4.CmpCode
innerjoindmsBaseChinaT6ONT5.province=T6.Id
whereconvert(varchar(10),T0.DocDay,23)>=@BeginDate
andconvert(varchar(10),T0.DocDay,23)<=@EndDate
and(T0.HFTypeName=@Name1or@Name1='')
and(T0.HFPsnName=@Name2or@Name2='')
----------
GROUPBY'除T3.L1DESC、T3.L1Answer、T3.L1Score所有列'
END
或者直接在報表裡面列分組
Ⅷ MySQL資料庫動態行轉列
這段時間要弄財務報表,遇到了一個動態行轉列的問題,資料庫用的是mysql的。感覺mysql實現動態行轉列比mssql復雜多了。網上的都是處理的一個表(比較簡單),而我要處理的數據來自於多個表,對於行轉列的行也要進行一定的過濾處理,最後在自己的努力下,總算出來啦,附件是完整代碼。這兩個存儲過程都是帶輸入參數的,一個對要轉的行有處理,一個沒有處理,兩個例子,都放出來,希望可以給遇到同樣問題的朋友一些幫助。
Ⅸ 求SQL存儲過程 要求 能行轉列
在存儲過程中行轉列之話,要用游標來實現。
不過下面有一個示例代碼,用來行轉列的。當然與是否為存儲過程無關。
請參考。
If object_id('ta') is not null
Drop table ta
Go
Create table ta(No int,c nvarchar(5),d smalldatetime,j numeric(4,2))
Go
Insert into ta
select 1,'PC001','20080901',12.30 union all
select 2,'PC001','20080902',12.50 union all
select 3,'PC001','20080903',12.10 union all
select 4,'PC001','20080904',15.60 union all
select 5,'PC001','20080905',14.10 union all
select 6,'PC002','20080901',13.20 union all
select 7,'PC002','20080902',12.30 union all
select 8,'PC002','20080903',14.50 union all
select 9,'PC002','20080904',16.20 union all
select 10,'PC002','20080905',14.20
Go
--Start
create table #(pid int identity(1,1), d datetime)
insert #(d) select distinct d from ta
declare @s1 varchar(8000),@s2 varchar(2000)
select @s2=isnull(@s2+',','')+''''+convert(char(10),d,112)+''''
from #
select @s1=isnull(@s1+',','')+'['+ltrim(pid)+']=max(case when convert(char(10),d,120) = '''+convert(char(10),d,120)+''' then cast(j as varchar) else '''' end)'
from #
exec('select * from (select c as no,'+ @s1+ ' from ta group by c union all select ''日期'','+@s2 + ') as t order by case when ascii(no) > 122 then 0 else 1 end ')
drop table #