當前位置:首頁 » 編程語言 » sql縱向

sql縱向

發布時間: 2022-10-15 16:37:40

① 在sql里,如何將橫向數據改成縱向數據結構

您好,行列轉換等經典SQL語句
參考資料:http://blog.csdn.net/kiki113/archive/2009/04/24/4105929.aspx
1.--行列轉換
原表: 姓名 科目 成績
張三 語文 80
張三 數學 90
張三 物理 85
李四 語文 85
李四 物理 82
李四 英語 90
李四 政治 70
王五 英語 90
轉換後的表: 姓名 數學 物理 英語 語文 政治
李四 0 82 90 85 70
王五 0 0 90 0 0
張三 90 85 0 80 0
實例:
create table cj --創建表cj
(
ID Int IDENTITY (1,1) not null, --創建列ID,並且每次新增一條記錄就會加1
Name Varchar(50),
Subject Varchar(50),
Result Int,
primary key (ID) --定義ID為表cj的主鍵
);
--Truncate table cj
--Select * from cj
Insert into cj
Select '張三','語文',80 union all
Select '張三','數學',90 union all
Select '張三','物理',85 union all
Select '李四','語文',85 union all
Select '李四','物理',82 union all
Select '李四','英語',90 union all
Select '李四','政治',70 union all
Select '王五','英語',90
--行列轉換
Declare @sql varchar(8000)
Set @sql = 'Select Name as 姓名'
Select @sql = @sql + ',sum(case Subject when '''+Subject+''' then Result else 0 end) ['+Subject+']'
from (select distinct Subject from cj) as cj --把所有唯一的科目的名稱都列舉出來
Select @sql = @sql+' from cj group by name'
Exec (@sql)
2. 行列轉換--合並
原表: 班級 學號
1 1
1 2
1 3
2 1
2 2
3 1
轉換後的表: 班級 學號
1 1,2,3
2 1,2
3 1

實例:
Create table ClassNo --創建表ClassNo
(
ID Int IDENTITY(1,1) not null, --創建列ID,並且每次新增一條記錄就會加1
Class Varchar(50), --班級列
Number Varchar(50), --學號列
Primary Key(ID) --定義ID為表ClassNo的主鍵
);
--Truncate Table ClassNo
--Select * from ClassNo
Insert Into ClassNo
Select 1,1 Union all
Select 1,2 Union all
Select 1,3 Union all
Select 2,1 Union all
Select 2,2 Union all
Select 3,1
創建一個合並的函數
--Drop Function KFReturn
Create Function KFReturn(@Class Varchar(50))
Returns Varchar(8000)
as
Begin
Declare @str Varchar(8000)
Set @str = ''
Select @str = @str + cast(Number as Varchar(50)) + ',' from ClassNo Where Class = @Class
Set @str = SubString(@str,1,len(@str)-1)
Return(@str)
End
調用自定義函數得到結果
Select Distinct Class,dbo.KFReturn(Class) From ClassNo
3:列轉行
--Drop Table ColumnToRow
Create table ColumnToRow
(
ID Int IDENTITY(1,1) not null, --創建列ID,並且每次新增一條記錄就會加1
a int,
b int,
c int,
d int,
e int,
f int,
g int,
h int,
Primary Key(ID) --定義ID為表ColumnToRow的主鍵
);
--Truncate Table ColumnToRow
--Select * from ColumnToRow
Insert Into ColumnToRow
Select 15,9,1,0,1,2,4,2 Union all
Select 22,34,44,5,6,7,8,7 Union all
Select 33,44,55,66,77,88,99,12
Declare @sql Varchar(8000)
Set @sql = ''
Select @sql = @sql + rtrim(name) + ' from ColumnToRow union all Select ' from SysColumns Where id = object_id('ColumnToRow')
Set @sql = SubString(@sql,1,len(@sql)-70)
--70的長度就是這個字元串'from ColumnToRow union all Select ID from ColumnToRow union all Select ',因為它會把ID這一列的值也算進去,所以要把它截掉
Exec ('Select ' + @sql + ' from ColumnToRow')

② SQL橫向+縱向合並

沒有表結構,不清楚寫的對不對,用了sum()over(),這是Oracle的用法,其他資料庫能不能用就不清楚了,以下是代碼

selectrownumas序號,a.*
from(selectdistincta.名稱as醫囑名稱,
zlspellcode(a.名稱)as簡碼,
e.類別,
b.檢查部位,
b.檢查方法,
c.名稱as收費名稱,
c.標識主碼,
b.收費數量as數量,
d.現價as價格,
c.站點,
dECOdE(A.撤檔時間,
to_date('3000-01-01','YYYY-MM-dd'),
NULL,
null,
null,
'√')AS是否停用,
sum(b.收費數量*d.現價)over()as價格
from診療項目目錄a,
診療收費關系b,
收費項目目錄c,
收費價目d,
收費類別e
wherea.Id=b.診療項目Id
ANdb.收費項目Id=c.id
andc.Id=d.收費細目Id
anda.類別=e.編碼
anda.撤檔時間=to_date('3000-01-01','yyyy-mm-dd')
andd.終止日期=to_date('3000-01-01','yyyy-mm-dd')
anda.類別[0]
anda.服務對象=[1]
---orderbya.名稱
)a
wherea.是否停用isnull
orderby序號

③ SQL如何將兩個列數不一樣的表的內容縱向拼接在一起

一句sql還是比較難辦到的。可以用存儲過程,先新建一張有九列新表,把表A中數據select出來插入新表中,再把表B中數據查詢出來並補上三個空欄位後插入新表。這樣新表就有表A+表B縱向拼接的效果了。

④ 怎樣用sql把一個數據集縱向截成三段然後橫向連接

這個數據集是我用別的方法做的

data means_2 (drop=Group);

merge means_1 (where=(group="A") rename=(age=GroupA))

means_1 (where=(group="B") rename=(age=GroupB))

means_1 (where=(group="C") rename=(age=Total)) ;

run ;
復制代碼
自己編了一個sql的版本,第一個數據集是means—1

proc sql ;

create table work.means_2 as

select means_1.*

from work.means_1 (where=(group="A"))

full join work.means_1 (where=(group="B"))

on means_1._STAT_=means

⑤ SQL SERVER中縱向的數據橫向顯示出來

create TABLE Table1 (Name varchar(50),Subject varchar(50))
INSERT INTO TABLE1 VALUES('A','a1')
INSERT INTO TABLE1 VALUES('A','a2')
INSERT INTO TABLE1 VALUES('A','a3')
INSERT INTO TABLE1 VALUES('A','a4')
INSERT INTO TABLE1 VALUES('A','a5')
INSERT INTO TABLE1 VALUES('A','a6')
INSERT INTO TABLE1 VALUES('A','a7')
INSERT INTO TABLE1 VALUES('B','b1')
INSERT INTO TABLE1 VALUES('B','b2')
INSERT INTO TABLE1 VALUES('B','b3')
INSERT INTO TABLE1 VALUES('B','b4')
INSERT INTO TABLE1 VALUES('B','b5')
INSERT INTO TABLE1 VALUES('B','b11')
INSERT INTO TABLE1 VALUES('B','b23')
INSERT INTO TABLE1 VALUES('B','b34')
INSERT INTO TABLE1 VALUES('B','b8')
INSERT INTO TABLE1 VALUES('B','b9')
INSERT INTO TABLE1 VALUES('B','b15')

就生成了表單TABLE1,如果把公司名稱A,B橫向輸出,Subject的話,比較簡單的是把Subject顯示在1列,裡面元素用","隔開,如果分列顯示,就要找到Subject最長的列,否則影響效率;
因為不知道你的參數最多是多少,所以就在1列中顯示.
可以寫一個函數F_str

create function F_str(@name varchar)
returns nvarchar(100)
as
begin
declare @S nvarchar(100)
select @S=isnull(@S+',','')+Subject from table1 where Name=@name
return @S
end

生成函數後在調用即可:
select distinct Name,Subject=dbo.F_str(Name) from Table1
自己用的話注意每次實驗刪除函數,不然創建2次重名的函數是不可以的

因為我的Name是動態讀取的,不管多少公司,都是沒問題的,唯一的不同就是
產品顯示出來是在一列當中,而不是分列顯示,不知道滿足你的需求嗎.

Name Subject
A a1,a2,a3.....
B b1,b2,b3.....
C c1,c2,c3.....
... .....

這種格式的,Subject是不分列的,在一列.
要是需要分列的話,實現比較麻煩,需要的話,和我說.

declare @c int,@sql varchar(5000)
set @c=(select max(a) from (select count(*)a from table1 group by name)b)

declare @i int
set @i=1
select x=@c,y='列'+cast(@c as varchar) into #temp
while @i<@c
begin
insert into #temp values(@i,'列'+cast(@i as varchar))
set @i=@i+1
end

select y,name,subject into #temp2 from #temp t left join (select ROW_NUMBER() over(PARTITION BY name order by name) as id,name,subject from table1 ) tb on tb.id=t.x

set @sql = 'select name'
select @sql = @sql + ' , max(case y when ''' + y + ''' then subject else null end )[' + y + ']'
from (select distinct y from #temp2 ) as a
set @sql = @sql + ' from #temp2 group by name'
exec(@sql)

drop table #temp
drop table #temp2
SQL2005可以用,2000估計不能用,2000函數不全

⑥ sql多表聯合查詢縱向數據

不知道 不過你可以先用vfp 添加表單後,看看裡面的sql語句是怎麼寫的。

我的電腦沒有裝vfp 要比可以幫你試一下。

⑦ SQL 將橫向數據轉為縱向記錄

使用union連接SQL語句,可以實現常見的SQL行轉列運用。

以圖中表格為例:


需要注意,如果有需要顯示重復記錄,把union 改成 union all

⑧ sql server多表縱向拼表查詢,怎麼批量處理

可以拼湊SQL語句,然後用exec執行字元串。
祝好運,望採納。

熱點內容
安卓上哪裡下大型游戲 發布:2024-12-23 15:10:58 瀏覽:186
明日之後目前適用於什麼配置 發布:2024-12-23 14:56:09 瀏覽:51
php全形半形 發布:2024-12-23 14:55:17 瀏覽:826
手機上傳助手 發布:2024-12-23 14:55:14 瀏覽:730
什麼樣的主機配置吃雞開全效 發布:2024-12-23 14:55:13 瀏覽:828
安卓我的世界114版本有什麼 發布:2024-12-23 14:42:17 瀏覽:708
vbox源碼 發布:2024-12-23 14:41:32 瀏覽:275
詩經是怎麼存儲 發布:2024-12-23 14:41:29 瀏覽:657
屏蔽視頻廣告腳本 發布:2024-12-23 14:41:24 瀏覽:417
php解析pdf 發布:2024-12-23 14:40:01 瀏覽:816