sql縱向變橫向
❶ 急急急!!! sql語句如何將豎排的記錄變橫排並且放置在同一單元格內,跪求大神指點,萬分感謝!!!
selectname姓名,col1+''+col2+''+col3參保類型
from(
selectname,'失業保險'ascol1,'醫療保險'ascol2,'工傷保險'ascol3fromtable1
pivot(max(type)fortypein([失業保險],[醫療保險],[工傷保險]))
aspvt)tab
lz試一下,有問題再追問。
❷ sql怎麼讓查詢的結果縱向變橫向
sql server有行列轉換的語句
❸ oracle 資料庫sql高手來看看,如何縱向轉橫向
假設表有A,B兩列,代碼如下
selectA,LISTAGG(B,',')WITHINGROUP(ORDERBYB)BfromtablegroupbyA
上面SQL文可將B列橫向輸出,以逗號分割,輸出順序按B的值升序排列
❹ sql語句 把縱向的數據變成橫向
declare @A table(欄位1 varchar(1), 欄位2 int)
insert into @A
select 'A',1 union all
select 'A',2 union all
select 'A',3 union all
select 'A',4 union all
select 'A',5 union all
select 'B',1 union all
select 'B',2 union all
select 'B',3 union all
select 'B',4 union all
select 'B',5
SELECT * from @a
select 欄位1,
max(case 欄位2 when 1 then 欄位2 end) 欄位2,
max(case 欄位2 when 2 then 欄位2 end) 欄位3,
max(case 欄位2 when 3 then 欄位2 end) 欄位4,
max(case 欄位2 when 4 then 欄位2 end) 欄位5,
max(case 欄位2 when 5 then 欄位2 end) 欄位6
from @A
group by 欄位1
---結果如下--------------------------------
(10 個資料列受到影響)
欄位1 欄位2
---- -----------
A 1
A 2
A 3
A 4
A 5
B 1
B 2
B 3
B 4
B 5
(10 個資料列受到影響)
欄位1 欄位2 欄位3 欄位4 欄位5 欄位6
---- ----------- ----------- ----------- ----------- -----------
A 1 2 3 4 5
B 1 2 3 4 5
(2 個資料列受到影響)
❺ sql縱向數據變為橫向數據遇到問題,請幫助,謝謝
selectName,STUFF((select','+Subjectfrom表whereName=A.Nameforxmlpath('')),1,1,'')from(selectdistinctNamefrom表)A
❻ Mysql中查詢(資料庫中的)縱向轉(查詢結果顯示為)橫向.
1、在mysql環境,創建資料庫表,
create table test_data1(id int, name VARCHAR(20), day VARCHAR(20))
❼ 如何通過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 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 裡面怎麼把豎表變成橫表
SELECT 姓名
,'數學'=MAX(CASE 課程 WHEN '數學' THEN 分數 ELSE 0 END)
,'語文'=MAX(CASE 課程 WHEN '語文' THEN 分數 ELSE 0 END)
,'英語'=MAX(CASE 課程 WHEN '英語' THEN 分數 ELSE 0 END)
FROM TB
GROUP BY 姓名
--或者
SELECT 姓名,
,'數學'=SUM(CASE 課程 WHEN '數學' THEN 分數 ELSE 0 END)
,'語文'=SUM(CASE 課程 WHEN '語文' THEN 分數 ELSE 0 END)
,'英語'=SUM(CASE 課程 WHEN '英語' THEN 分數 ELSE 0 END)
FROM TB
GROUP BY 姓名