行轉列的思考

2021-09-22 12:05:31 字數 3207 閱讀 1303

最近遇到乙個行轉列的問題,給定乙個時間段,統計每天每個車的簽到情況,用動態拼接的方法實現,受varchar(8000)的影響,拼接的sql語句不能太長,遇到這種動態列頭的問題,這種方法肯定不是很好,希望有高人指點新招~

/*建立車資訊表*/

go

ifnot

exists (select

1from sysobjects where id =

object_id('

car') and type='u

')begin

create

table

car

(carid

uniqueidentifier

, carname

varchar(100

) )

endgo

/*插入一些資料

*/insert

into car select

newid(),'

car1

'union

select

newid(),'

car2

'union

select

newid(),'

car3

'union

select

newid(),'

car4

'union

select

newid(),'

car5

'union

select

newid(),'

car6

'union

select

newid(),'

car7'/*

建立簽到表

*/go

ifnot

exists (select

1from sysobjects where id =

object_id('

cartime

') and type='u

')begin

create

table

cartime

(cartimeid

uniqueidentifier

, carid

uniqueidentifier

, operatedate

datetime

)end

go/*

插入一些資料

*/declare

@iint

set@i=1

while (@i

<=10)

begin

insert

into cartime select

newid(),carid,'

2012-08-'+

convert(varchar(10),@i) from

car

set@i=@i

+1end/*

統計一段時間所有車每天的簽到情況

*/go

ifexists (select

1from sysobjects where id =

object_id('

sp_cartimereport

') and type='p

')begin

drop

proc

sp_cartimereport

endgo

create

proc

[dbo

].[sp_cartimereport

]@begindate

datetime

,

@enddate

datetime

asbegin

declare

@begin

datetime

declare

@end

datetime

set@begin

=convert(datetime,convert(varchar(10),@begindate,120

))

set@end

=convert(datetime,convert(varchar(10),@enddate,120

))

declare

@index

datetime

set@index

=@begin

declare

@sql

varchar(8000

)

set@sql='

select car.carname as 車名

'while(@index

<=

@end

)

begin

set@sql

=@sql+'

,case when sum(case when convert(varchar(10),cartime.operatedate,120)=

'''+

convert(varchar(10),@index,120) +

'''then 1 else null end) is not null then ''√

''else null end as

'''+

convert(varchar(10),@index,120) +

''''

set@index

=@index+1

endset

@sql

=@sql+'

from car left join cartime on car.carid=cartime.carid

group by car.carid,car.carname

order by car.carname

'exec(@sql

) end

--drop table car

--drop table cartime

--drop proc sp_cartimereport

--exec sp_cartimereport '

2012-08-01

','2012-08-30

'

執行效果如下:

mysql行轉列 subs mysql 行轉列

存在表score,記錄學生的考試成績,如下圖所示 現要求以 學生姓名,語文,數學,英語 這種格式顯示學生成績,如下圖所示 具體步驟如下 1 首先,使用case when函式輸出單個課程的成績 case when course 語文 then score end as 語文 case when cou...

mysql 動態行轉列 MySQL行轉列

比如乙個單子,多個收據單用逗號隔開,怎麼把這乙個單子所有收據單獨展示出來,行轉成列呢?方法一 這裡需要用到迴圈,首先建立乙個1 10的序列 select rownum rownum 1 as seq from select rownum 0 r,bills limit 0,10 其次依次運用 sub...

oracle 行轉列,多行轉列

問題描述 應公司要求,設計功能,乙個id,對應不同的值,展示的時候不同的值拼接展示,如何實現 解決思路 1 拼接字串,想到了 oracle function 這樣肯定能實現,但是比較麻煩 2 oracle 自帶的乙個函式 wm concat 函式 非常給力 上 測試表1 create table c...