乙個經典的行轉列解決方法

2022-02-17 06:03:08 字數 3140 閱讀 8290

問題的描述是這樣的

表a:工作年月,部門,工資,工資附加,三金,固定成本,非固定成本,管理費,成本小計,收入,稅金,盈虧

輸入結果:

專案             部門1         部門2         部門3         部門4              小計

本月/本年      本月/本年     本月/本年     本月/本年        本月/本年

工資           100/300         100/300       ....

工資附加       ...

三金           ...

固定成本       ...

非固定成本     ...

管理費         ...

成本小計       ...

收入           ...

稅金           ...

盈虧           ...

如何生成這張表

我是這樣解決的,通過兩層迴圈,生成sql語句,並執行,**如下

create table 表a

(工作年月 datetime,

部門 varchar(20),

工資 money,

工資附加 money,

三金 money,

固定成本 money,

非固定成本 money,

管理費 money,

成本小計 money,

收入 money,

稅金 money,

盈虧 money

)insert into 表a select '2006-1-1','部門1', 1,1,1,1,1,1,1,1,1,1

insert into 表a select '2006-5-1','部門1', 1,1,1,1,1,1,1,1,1,1

insert into 表a select '2006-1-1','部門2', 1,1,1,1,1,1,1,1,1,1

insert into 表a select '2006-5-1','部門2', 1,1,1,1,1,1,1,1,1,1

insert into 表a select '2006-1-1','部門3', 1,1,1,1,1,1,1,1,1,1

insert into 表a select '2006-5-1','部門3', 1,1,1,1,1,1,1,1,1,1

insert into 表a select '2006-1-1','部門4', 1,1,1,1,1,1,1,1,1,1

insert into 表a select '2006-5-1','部門4', 1,1,1,1,1,1,1,1,1,1

insert into 表a select '2005-12-1','部門4', 1,1,1,1,1,1,1,1,1,1

declare @sql varchar(8000)

declare @t varchar(8000)

declare @type varchar(50)

declare cur_type cursor for

select * from (select '工資' 專案 union

select '工資附加' union

select '三金' union

select '固定成本' union

select '非固定成本' union

select '管理費' union

select '成本小計' union

select '收入' union

select '稅金' union

select '盈虧') b

select @sql=''

open cur_type

fetch next from cur_type into @type

while @@fetch_status = 0

begin

select @t='''' + @type + ''''

select @t=@t+',cast(sum(case when 部門=''' +a.部門+ ''' and datediff(month, 工作年月, getdate())=0 then ' +@type+ ' else 0 end) as varchar(10))' + a.部門 +'本月'

---  cast(sum(case when 部門='''+a.部門+''' and datediff(year, 工作年月, getdate())=0 then ' +@type+ ' else 0 end) as varchar(10)) ' + a.部門 +'本月本年'

from

(select distinct(部門) 部門 from 表a) a

select @t=@t+',cast(sum(case when datediff(month, 工作年月, getdate())=0 then ' +@type+ ' else 0 end) as varchar(10)) 小計'

select @t = ' select ' + @t + ' from 表a'

select @sql=@sql+@t+' union'

fetch next from cur_type into @type

endclose cur_type

deallocate cur_type

select @sql=left(@sql,len(@sql)-6)

exec (@sql)

drop table 表a

/* 部門1本月 部門2本月 部門3本月 部門4本月 小計

成本小計 1.00 1.00 1.00 1.00 4.00 

非固定成本1.00 1.00 1.00 1.00 4.00 

工資 1.00 1.00 1.00 1.00 4.00 

工資附加 1.00 1.00 1.00 1.00 4.00 

固定成本 1.00 1.00 1.00 1.00 4.00 

管理費 1.00 1.00 1.00 1.00 4.00 

三金 1.00 1.00 1.00 1.00 4.00 

收入 1.00 1.00 1.00 1.00 4.00 

稅金 1.00 1.00 1.00 1.00 4.00 

盈虧 1.00 1.00 1.00 1.00 4.00 

*/

乙個行轉列的應用

liangck小梁 於2008 10 15 生成測試資料 t if object id tempdb.dbo.t is not null drop table t create table t id int,姓名 varchar 4 類別 varchar 1 單位 varchar 6 insert ...

乙個有用的故障解決方法

樓主wjf666 2006 01 24 01 29 53 在 windows專區 windows nt 2000 xp 2003 提問 我用的是xp sp2 系統,用xp自帶的adsl撥號軟體撥號上網,現在只要一撥號機器就象宕機一樣,任務攔沒有響應,大致要 分鐘機器才可恢復,然後就一切正常了 如果在...

乙個奇怪的問題的解決方法

前段時間寫了個函式,通過反射機制得到jar包下,所有類以及測試方法,但是今天將應用部署到linux伺服器上,測試怎麼都跑不通而且包解析的類找不到,為此非常鬱悶,開始查錯。第一步,懷疑是jar包路徑的問題,將jar包拷貝到預設路徑下,進行驗證,可以解析類,於是想著是否可以讓jboss的應用能夠識別不放...