最近遇到乙個行轉列的問題,給定乙個時間段,統計每天每個車的簽到情況,用動態拼接的方法實現,受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...