當前位置:首頁 » 編程語言 » 橫向轉豎列sql
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

橫向轉豎列sql

發布時間: 2023-08-05 22:17:25

sql 將橫向數據轉為縱向記錄

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

以圖中表格為例:


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

Ⅱ SQL數據橫列變豎列

以下方法適用於任意多的科目:
--先建立函數,功能是根據給出的姓名,到表中去查找所選科目及成績並橫向列示出來.
CREATE FUNCTION getcoldata
(@XM VARCHAR(18))
RETURNS varchar(1000)
AS
BEGIN
DECLARE @deli VARCHAR(2)
set @deli=' '
declare @f1 varchar(100),@F2 DECIMAL(12,1),@result varchar(1000),@sn0 int
set @result=''
declare ddcursor cursor for select 選修科目,成績 from 表名 where 姓名=@XM order by 選修科目
open ddcursor
fetch next from ddcursor into @f1,@F2
while @@fetch_status!=-1
begin
set @result=@result+@deli+isnull(@f1,'')+':'+ISNULL(CONVERT(VARCHAR,@F2),'')
fetch next from ddcursor into @f1,@F2
end
close ddcursor
deallocate ddcursor
return (@result)
end

GO

--使用方法:
select 姓名,科目及成績=dbo.getcoldata(姓名) from (SELECT DISTINCT 姓名 from 表名) a

結果是這樣的
姓名 科目與成績
張三 計算機:75 高等數學:80 物理:77
李四 高等數學:55 微積分:87
王五 語文:78

=============
我這么看您的問題:
1.查詢是用來輸出的,不是用來統計的:您的這種結果即使用分開欄位也是很不容易統計的,要想統計還是原表比較方便.
就是說:這種查詢結果更方便輸出\查看,原表更方便於作統計.
所以,我勸您,比較科學的作法是保留原表,可以方便的作出包括本查詢在內的各種查詢.而您如果只保留查詢後的表,即使用欄位是分開的,那麼將很難再作其它統計和查詢.因為數據太不規范.

2.可以輸出各門分開的EXCEL表:如果您想輸出到EXCEL表,您要以把函數中的分隔符改成逗點或製表符(CHAR(9)),直接存成CSV或XLS文檔就成了.
3.完全按照您的結果也能輸出.但今天我沒空了,給你個提示:
先看看我以前的回答中,有一些是關於加序號的,加上序號後就好說了.
===========
加到200分,我就開始為您作分開欄位的查詢.(辦法我知道,但是很麻煩啊)
===============================================
與您的要求完全相同的查詢:
為了清楚,先建立一個查詢,給每人的科目加序號,如果不理解,執行一下SELECT * FROM MYVIEWNAME就知道了:
=====================

視圖改一下:
create view myviewname
as
select 姓名,科目,成績,序號=(select count(1) from tablename a where a.姓名=b.姓名 and a.科目>=b.科目) from
(select * from tablename where 狀態='有效') --以子查詢替換了TABLENAME,夠直觀吧?
b --視圖加上了序號欄位
go

然後,這就是您要的查詢,根據每人所選科目的最大數,可以無限向後延伸,加入科目6,科目7等:
select a.姓名,
科目1=isnull(t1.科目,''),
成績1=isnull(t1.成績,''),
科目2=isnull(t2.科目,''),
成績2=isnull(t2.成績,''),

科目3=isnull(t3.科目,''),
成績3=isnull(t3.成績,''),

科目4=isnull(t4.科目,''),
成績4=isnull(t4.成績,''),

科目5=isnull(t5.科目,''),
成績5=isnull(t5.成績,'')
from (SELECT DISTINCT 姓名 from tablename) a
left join myviewname t1 on t1.姓名=a.姓名 and t1.序號=1
left join myviewname t2 on t2.姓名=a.姓名 and t2.序號=2
left join myviewname t3 on t3.姓名=a.姓名 and t3.序號=3
left join myviewname t4 on t4.姓名=a.姓名 and t4.序號=4
left join myviewname t5 on t5.姓名=a.姓名 and t5.序號=5

好了,加到200分再選擇正確答案!

Ⅲ SQL 橫排變豎排的問題

給例子遠比你貼代碼快,

SELECT name,
SUM(CASE subject WHEN '語文' THEN Result ELSE 0 END),
SUM(CASE subject WHEN '數學' THEN Result ELSE 0 END),
SUM(CASE subject WHEN '物理' THEN Result ELSE 0 END)
FROM tb
GROUP BY Name

Ⅳ SQL 怎麼把橫向數據變成豎向數據

隨緣寫法···可能有更精簡的,我這就趕著想趕著寫的 你看看能看懂不,如果覺得對不懂可以聯系我

select
nn.客戶 客戶,
nn.昵稱 昵稱,
nn.補單日期1 補單日期1,
nn.業務員1 業務員1,
nn.補單日期2 補單日期2,
nn.業務員2 業務員2,
nn.補單日期3 補單日期3,
nn.業務員3 業務員3,
nn.補單日期4 補單日期4,
nn.業務員4 業務員4,
nn.業務員1 首選業務員,
nn.業務員2||'-'||nn.業務員3||'-'||nn.業務員4 候選業務員
from (
select tt.a2 客戶,tt.a3 昵稱,wm_concat (case when tt.top=0 then tt.a0 else '' end) 補單日期1,
wm_concat (case when tt.top=0 then tt.a4 else ''end) 業務員1,
wm_concat (case when tt.top=1 then tt.a0 else ''end) 補單日期2,
wm_concat (case when tt.top=1 then tt.a4 else ''end) 業務員2,
wm_concat (case when tt.top=2 then tt.a0 else ''end) 補單日期3,
wm_concat (case when tt.top=2 then tt.a4 else ''end) 業務員3,
wm_concat (case when tt.top=3 then tt.a0 else''end) 補單日期4,
wm_concat (case when tt.top=3 then tt.a4 else ''end) 業務員4
from
(
select zz.* from
(
select a.*,(select count(1) from a a1 where a1.a2=a.a2 and a.a0<a1.a0) top from a ORDER BY A2,A0 DESC
) zz
where
zz.top<4
) tt group by tt.a2,tt.a3
) nn



Ⅳ 一張收款表,SQL數據橫列變豎列

可以先

select 一下 插入臨時表 做個匯總
例如:
select sum(要匯總的欄位) as 欄位名 into #臨時表 from 表名

然後再 按 行轉列的方法 轉換

http://blog.sina.com.cn/s/blog_4cca663f0100abfv.html
這里有 很詳細的 方法 看看吧

Ⅵ 動態Sql語句實現橫表轉豎表,成績轉成列

select @sql1 = @sql1 + ' , max(case CouName when ''' + CouName + ''' then Score else NULL end) 這里寫錯了,應該是
select @sql1 = @sql1 + ' , max(case when CouName =''' + CouName + ''' then Score else NULL end) CouName

然後後面少了group by 學號,姓名行轉列後面一定要把不轉的列group 出來

Ⅶ Sql語句查詢問題,如何將橫排的數據變為豎排

select*from
(
select PartNO , Year,Month='Jan' , Result = Jan from tb1
unionall
select PartNO , Year,Month ='Feb' , Result = Feb from tb1
unionall
select PartNO , Year,Month='Mar' , Result = Mar from tb1
) t
orderby PartNO, case Month when'Jan' then1when'Feb'then 2 when'Mar' then3 end

Ⅷ 在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查詢橫轉豎顯示

--建立測試數據
create table tb1
(
id varchar(20) not null,
value varchar(20) not null
)
go

insert into tb1
select '1','aa'
union all
select '1','bb'
union all
select '2','aaa'
go
--由於你這表裡沒有主健,可以用來做標識用,可以先生成一個臨時表,並加上自增欄位px用來做唯一標識列
select px=IDENTITY(INT,1,1),id,value
INTO #temptb
from tb1
go
select * from #temptb
go
--動態SQL
declare @sql varchar(8000)
set @sql = 'select'
select @sql = @sql + ',max(case px when ' +CONVERT(varchar(4),px)+ ' then value else '''' end) [' + id + ']'
from (select * from #temptb) a
set @sql = STUFF(@sql,7,1,' ') + ' from #temptb'
exec(@sql)
go
--靜態SQL
select max(case px when 1 then value else '' end) [1],
max(case px when 2 then value else '' end) [1],
max(case px when 3 then value else '' end) [2]
from #temptb
go
--刪除測試數據
DROP TABLE #temptb
go
DROP TABLE tb1

返回:

(所影響的行數為 3 行)

(所影響的行數為 3 行)

px id value
1 1 aa
2 1 bb
3 2 aaa

(所影響的行數為 3 行)

1 1 2
aa bb aaa

1 1 2
aa bb aaa

(所影響的行數為 1 行)