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

sql中的行列互轉

發布時間: 2022-07-10 05:10:55

1. sql行列轉換

1> create table tb(姓名 varchar(10) , 課程 varchar(10) , 分數 int)
2> Insert tb
3> Select '張三','語文',60 union all
4> Select '張三','數學',70 union all
5> Select '張三','英語',80 union all
6> Select '張三','物理',90 union all
7> Select '李四','語文',65 union all
8> Select '李四','數學',75 union all
9> Select '李四','英語',85 union all
10> Select '李四','物理',95
11> go

(8 行受影響)

1>
2> SELECT
3> *
4> FROM
5> tb
6> PIVOT(
7> SUM([分數])
8> FOR [課程] IN ([語文],[數學] )
9> ) tmp
10> go
姓名 語文 數學
---------- ----------- -----------
李四 65 75
張三 60 70

(2 行受影響)

好像沒有辦法,課程名字必須寫在 SQL 裡面。

FOR [課程] IN ([語文],[數學] )

2. sql server 2005中,如何將行列轉換

create table test1(星期 varchar(10),日期 datetime,一班 varchar(10),二班 varchar(10))

insert into test1
select '星期二', '2012-5-1 0:00','張,王',' 李,趙 '
union all
select ' 星期三','2012-5-2 0:00','李,趙','張,王 '
union all

select ' 星期四 ','2012-5-3 0:00','張,王','李,趙' union all
select '星期五','2012-5-4 0:00','李,趙','張,王' union all
select '星期六','2012-5-5 0:00','張,王','李,趙' union all
select '星期日','2012-5-6 0:00','李,趙','張,王' union all
select '星期一','2012-5-7 0:00','張,王','李,趙' union all
select '星期二','2012-5-8 0:00','李,趙','張,王' union all
select '星期三','2012-5-9 0:00','ddd','李,趙'

因為sqlserver pivot 函數轉換的時候 都是轉換一列,你這個要轉3個列,因為也要把日期給轉上去。 所以 就先 把你的源表分開。分成 臨時表1( 日期,星期,一班)、臨時表2(日期,星期,二班)。等兩個都轉換好了之後 再union 。 下班是我轉的 第一。只把一班的轉過來了。二班的 類似就行了,到時候一班二班union的時候 按照日期排序,所以都先保留了日期。。 比較復雜,暫時沒有想到好的辦法。。。。。。

select *,ROW_NUMBER() over(order by 日期 asc) row,case when 星期一 is not null then 日期 end 星期一1,
case when 星期二 is not null then 日期 end 星期二1,
case when 星期三 is not null then 日期 end 星期三1,
case when 星期四 is not null then 日期 end 星期四1,
case when 星期五 is not null then 日期 end 星期五1,
case when 星期六 is not null then 日期 end 星期六1,
case when 星期日 is not null then 日期 end 星期日1
into #a
from (
select * from (
select 星期,日期,一班 from test1
) a
pivot (
max(一班)
for 星期 in (星期一,星期二,星期三,星期四,星期五,星期六,星期日)
)pvt

) a

select * from (
select row,日期,星期一,星期二,星期三,星期四,星期五,星期六,星期日 from #a
union all
select ROW,日期,convert(varchar(10),星期一1,120 ),convert(varchar(10),星期二1,120 ),convert(varchar(10),星期三1,120 ),convert(varchar(10),星期四1,120 ),convert(varchar(10),星期五1,120 ),convert(varchar(10),星期六1,120 ),convert(varchar(10),星期日1,120 ) from #a
)a order by 1

3. 在excel中用sql語句實現行列轉置

在excel中,使用SQL太麻煩了。
有專門的功能,叫透視表,可以試一下。

4. Sql怎麼實現行列轉換

很遺憾 行列之間不是那麼隨便說轉換就轉換的
行 描述的是一個對象 列 只是對象的一個屬性
java里說的是
萬物皆對象
只要是對象 就可以吧特徵抽象成一個類
這就對應於資料庫的表
膚淺的說
表就相當於一個類
比如人這一類 有手屬性,腳屬性,頭屬性....就不多列舉了
他們構成了一個人 (人類表的一行) 而N多擁有相同特徵的人 就組成了人類 (人類這個表)
樓主你現在要做的事情無異於要把人給肢解 要把每一個人的手或腳或其他單一部件代替某一個人的全部部件(當做屬性)

說簡單一點就是 樓主你要的效果就是讓人類表的美一個人都不同 而且不同的方式還很奇怪 一個人只有手 一個又只有腳 一直有隻有頭.....最後整的相同特徵全無
這完全不符合歸為一類 化為一個表的初衷嘛

不說能不能化行為列

就算可以換行成列 那又有什麼意思呢?

完全沒有意義嘛

而且在實際開發中也不會有化行成列的需求

5. sql 行列轉置

看看這個吧

SQLServer中(行列轉換)行轉列及列轉行且加平均值及匯總值

6. sql中行列轉換的代碼怎麼寫

主要應用case語句來解決行轉列的問題

行轉列問題主要分為兩類

1)簡單的行轉列問題:

示例表:

id sid course result

1 2005001 語文 80.0
2 2005001 數學 90.0
3 2005001 英語 80.0
4 2005002 語文 56.0
5 2005002 數學 69.0
6 2005002 英語 89.0

執行

select sid,語文=isnull(sum(case course when '語文' then result end),0),
數學=isnull(sum(case course when '數學' then result end),0),
英語=isnull(sum(case course when '英語' then result end),0)
from result
group by sid
order by sid

得出結果

sid 語文 數學 英語

2005001 80.0 90.0 80.0
2005002 56.0 69.0 89.0

2)較為復雜的行轉列

表1:course

id name

1 語文
2 數學
3 英語

表2:result

id sid course result

1 2005001 語文 80.0
2 2005001 數學 90.0
3 2005001 英語 80.0
4 2005002 語文 56.0
5 2005002 數學 69.0
6 2005002 英語 89.0

declare @sql varchar(8000)
set @sql='select sid'
select @sql=@sql+','+course.name+'=isnull(sum(case course when '''+course.name+''' then result end),0)'
from course order by id
set @sql=@sql+' from result group by sid order by sid'
print @sql
exec(@sql)

得出結果

sid 語文 數學 英語

2005001 80.0 90.0 80.0
2005002 56.0 69.0 89.0

7. sql 行列轉換

我來說一下:
這個可以寫成一句普通的sql,你這寫的是動態sql,性能不如普通sql,並且欄位名「語文」、「數學」、「物理」,你還無法加上。
一句sql:select 姓名,『語文』=sum(case 課程 when 『語文』 then 分數 esle 0 end),『數學』=sum(case 課程 when 『數學』 then esle 0 分數 end),『物理』=sum(case 課程 when 『物理』 then esle 0 分數 end)from tb group by 姓名
這個其實和他們的差不多,你把這個理想了,你會覺得很簡單的,動態sql寫的挺復雜的,老實說,我都看不懂,我也懶得看。不理解的問我。
你記住這樣一句話:一列數據變成多列數據,用case語句;
一行數據變成多行數據,考慮自連接。

8. SQL里行列轉換

sqlserver2005中可以用
Pivot UnPivot
來實現。

sqlserver2000的話,行數 和列數在資料庫中是可變的,恐怕很難實現。想想存儲過程+臨時表吧。

9. SQL資料庫中錶行列轉換顯示

只有新創建一張表。CREATE TABLE t_row_col AS
SELECT id, 'c1' cn, c1 cv
FROM t_col_row
UNION ALL
SELECT id, 'c2' cn, c2 cv
FROM t_col_row
UNION ALL
SELECT id, 'c3' cn, c3 cv FROM t_col_row;
SELECT * FROM t_row_col ORDER BY 1,2;

10. oracle sql 中 如何實現table的行列轉換

你所謂的行列轉換應該是指縱表轉橫表,橫表轉縱表.
給你個例子
縱表轉橫表:
使用DECODE語句,可以很方便的將縱表轉為橫表,例子如下:
原表查詢結果:
ID MAJOR CURRENT_CREDITS
------ ---------------- ---------------
10000 Computer Science 98
10000 History 88
10001 Computer Science 75
10000 Economics 66
我們要把各科成績從同一列轉到不同的列中去。
SQL>?select id,
sum(decode(major,』Computer Science』,current_credits,0)) cs,
sum(decode(major,』History』,current_credits,0)) his,
sum(decode(major,』Economics』,current_credits,0)) eco
from students
group by id
ID CS HIS ECO
------ ----------- ------------- -----
10000 98 88 66
10001 75

橫表轉縱表:
使用 UNION 即可實現將橫表轉為縱表,以上面的表為例:
轉換前:
ID CS HIS ECO
------ ----------- ------------- -----
10000 98 88 66
SQL>?select id, 』Computer Science』 major,cs current_credits
from students
union
select id, 』History』 major,his current_credits
from students
union
select id, 』Economics』 major,eco current_credits
from students
ID MAJOR CURRENT_CREDITS
------ ---------------- ---------------
10000 Computer Science 98
10000 History 88
10000 Economics 66