一 、翻转输出一个表,就是行变列 列变行。比如:某表数据是:
field1 field2 field3
----------------------
a b c
d e f
用select得到
d a
e b
f c
或者
a d
b e
c f
随便用啥数据库,只要能够做出就可以了 (不能使用游标哦。(因为游标要使用到存储过程,不能算)。
写了一个:
select F1,bf1 from test a join (select id,F1 as bf1 from test) b on b.bf1>a.f1
union
select F2,bf2 from test a join (select id,F2 as bf2 from test) b on b.bf2>a.f2
union
select F3,bf3 from test a join (select id,F3 as bf3 from test) b on b.bf3>a.f3
order by f1
解决:
---------------------------
1。如果没有格的要求,可以用一个函数来实现,把一列的东西连起来显示就可以了(当然,这类似以前的一个转置帖子,所以不算我想的)
2。把显示器转90度放置(这是我想的,速度很快,也不多加时间)
3。用动态SQL(我觉得这样不用考虑记录有多少行)下面是我用第三种方法的实现
--1建立环境
create table TBb(
field1 varchar(5),
field2 varchar(5),
field3 varchar(5)
)
--插入数据(略)
--下面是查询(也是我想了好久想到的答案)
begin transaction
declare @v_maxcol int, @v_numcol int
declare @v_tempsql1 varchar(1000),@v_tempsql2 varchar(1000),
@v_tempsql3 varchar(1000),@v_tempsql4 varchar(1000)
declare @v_data varchar(5)
set @v_data = '5'
set @v_numcol = 1
select @v_maxcol = count(field1) from TBb
set @v_tempsql1 = 'declare @v_tb table('
set @v_tempsql2 = 'insert @v_tb values('
set @v_tempsql3 = 'insert @v_tb values('
set @v_tempsql4 = 'insert @v_tb values('
while @v_numcol <= @v_maxcol
begin
set @v_tempsql1 = @v_tempsql1 + 'col'+convert(varchar(5),@v_numcol)+' varchar(5),'
set @v_numcol = @v_numcol + 1
end
set @v_tempsql1 = substring(@v_tempsql1,1,len(@v_tempsql1)-1)+')'
select @v_tempsql2 = @v_tempsql2 + ' '' '+ field1 + ' '', ' from TBb
set @v_tempsql2 = substring(@v_tempsql2,1,len(@v_tempsql2)-1)+')'
select @v_tempsql3 = @v_tempsql3 + ' '' '+ field2 + ' '', ' from TBb
set @v_tempsql3 = substring(@v_tempsql3,1,len(@v_tempsql3)-1)+')'
select @v_tempsql4 = @v_tempsql4 + ' '' '+ field3 + ' '', ' from TBb
set @v_tempsql4 = substring(@v_tempsql4,1,len(@v_tempsql4)-1)+')'
exec(@v_tempsql1+' '+@v_tempsql2+' '+@v_tempsql3+' '+@v_tempsql4+' select * from @v_tb')
commit
二、表 userinfo 有两个字段 username (主键,VARCHAR型) ,user_id(INT型)。
现想将表中所有以jhb 结尾的 记录的 user_id 值替换成username 前半部分与其相同并且最后3个字符是zzb的记录的user_id 的值(如下例中123zzb与123jhb 以及abd5234zzb与abd5234jhb)。
举例:(左侧为原表,右侧为更新后)
username user_id
123zzb 88
123jhb 77
77894qsd 22365
abd5234zzb 44
abd5234jhb 369
更新后:
username user_id
123zzb 88
123jhb 88
77894qsd 22365
abd5234zzb 44
abd5234jhb 44
123jhb 与123zzb 就最后3位字符串不一样,并且123zzb最后3位是zzb,更新后,应该使得123jhb 的user_id 的值= 123zzb 的user_id 的值。abd5234zzb 以及 ab5234jhb也是一样,更新后,ab5234jhb的user_id 的值应该等于abd5234zzb的user_id的值。 请问如何使用sql 代码实现?允许新增表操作。
解决:
----------------------------------
declare @t table(username varchar(50),userid int) insert into @t select '123zzb',88 union all select '123jhb',77 union all select '77894qsd',22365 union all select 'abd5234zzb',44 union all select 'abd5234jhb',369 select * from @t select *,substring(username,1,len(username)-3) as tt into #tt from @t where patindex('%jhb%',username)>0 select username as a,userid as b ,aa=(select userid from @t b where b.username not in (select username from #tt) and substring(a.username,1,len(a.username)-3)=substring(b.username,1,len(b.username)-3)) into #dd from @t a where patindex('%jhb%',username)=0 update @t set userid=(select b from #dd where substring(a,1,len(a)-3)=substring(username,1,len(username)-3)) where patindex('%jhb%',username)>0 select * from @t drop table #tt drop table #dd |
三、
查询分析器中执行就能找到造成阻塞的语句,就是耗资源的
use master
go
declare @spid int,@bl int
DECLARE s_cur CURSOR FOR
select 0 ,blocked
from (select * from sysprocesses where blocked>0 ) a
where not exists(select * from (select * from sysprocesses where blocked>0 ) b
where a.blocked=spid)
union select spid,blocked from sysprocesses where blocked>0
OPEN s_cur
FETCH NEXT FROM s_cur INTO @spid,@bl
WHILE @@FETCH_STATUS = 0
begin
if @spid =0
select ' 引起数据库死锁的是 : '+ CAST(@bl AS VARCHAR(10)) + ' 进程号 , 其执行的 SQL 语法如下 '
else
select ' 进程号 SPID : '+ CAST(@spid AS VARCHAR(10))+ ' 被 ' + ' 进程号 SPID : '+ CAST(@bl AS VARCHAR(10)) +' 阻塞 , 其当前进程执行的 SQL 语法如下 '
DBCC INPUTBUFFER (@bl )
FETCH NEXT FROM s_cur INTO @spid,@bl
end
CLOSE s_cur
DEALLOCATE s_cur
exec sp_who2