救命:SQL语句,高手进来看看(50分)

  • 主题发起人 主题发起人 silverwolf
  • 开始时间 开始时间
S

silverwolf

Unregistered / Unconfirmed
GUEST, unregistred user!
把一张表:(A,B,D为varchar,c为TinyInt)
A B C D
--------------------------------
low y 4 +
High y 4 +
High n 4 +
low n 6 -
low y 6 -

转化成为(A,B,C,D都为TinyInt):
A B C D
--------------------
0 0 0 0
1 0 0 0
1 1 0 0
0 1 1 1
0 0 1 1

转化过程如下:对属性值第一类取为0,第二类取为1,……
如何实现(数据库是(sqlsever2000),可否用一个adoquery,如果表较大大的时候应该如何提高转化的效率
 
在Oracle中有个decode函数很简单

在sqlsever2000也有个类似的在SQL中嵌套判断的语法,查一下好了
 
select case when A='low' then 0 when A='high' then 1 end A,case when B='y'
then 0 when B='n' then 1 end B,case when C=4 then 0 when C=6 then 1 end C,case
when D='+' then 0 when D='-' then 1 end D from tablename ......
 
softboy,关键是我根本不知道属性值是什么,本来用一个查询,一个update是可以搞定,
我想能不能用一个语句就解决掉。
 
一条语句不太可能,用触发器或存储过程可以快些(结构要好)。
用不着追求语句少,速度快才是真的好,讨论速度可以把你的说一说。
如果用存储过程,可以只用一条EXEC XXXXXXXXX,这好像不符合题意。
 
用存储过程很容易实现,首先得到某一字段的所有值
select distinct(a) from table 用游标把它放入一个数组中,
再用softboy的case 对照转换成相应的值就行了
 
select A = CASE WHEN A.A = B.A THEN 0 ELSE 1 END,
B = CASE WHEN A.B = B.B THEN 0 ELSE 1 END,
C = CASE WHEN A.C = B.C THEN 0 ELSE 1 END,
D = CASE WHEN A.D = B.D THEN 0 ELSE 1 END
FROM YOURTABLE A,(SELECT TOP 1 FROM YOURTABLE) B
 
谢谢诸位的帮助,这里我重新描述一下问题:
我要编的这段程序是对应与任一张表的,而不是对应于指定的一张表,
程序的功能是:对表类每个列属性值相同归为一类,并对类标号为0,1,2,3……,
存入一张表。
今天考虑了下,的确无法用一个语句实现。
wp_hammer,book523能不能给段比较详细的代码描述?
 
听课。[:)]
to wp_hammer,book523:如果可能,请把详细的存储过程描述公开。我是一个新手,
希望了解如何使用存储过程。谢谢。
 
我认为,shiny的思路是对的(不过是没有insert into )。不过当你不确定表结构的时候(或者说
不知道具体有多少个字段),可以动态的生成sql语句。
 
你说的第一类是如何区别的,是按数据转为字符串后,
按字符自然排序后,取的第一行为第一类吗?
或者每个表都有一个自动的字段(比如 IDENTITY 类型的字段)
分类时,就是按这个字段来排序对应的
 
不会吧,根据shiny的写法,如果我每列有255个不同的值,那么SQL语句……,如果
更多不同……,有点可怕。
 
这是我的一个存储过程,你参考一下吧!

------客户动态分析
ALTER PROCEDURE dbo.[f_sp_CustomDF]
(
@AccNo varchar(13),--客户帐号
@type varchar(6),--分析周期,month,day,xun(旬)
@value varchar(6) --type为day时,前四位为年份,后两位为月份;为 month,xun时,是四位年份

)AS
begin

declare @intPeriod smallint --周期数
declare @intTemp smallint
declare @transdate datetime
declare @Balance decimal(12,2)
declare @i smallint
declare @str varchar(10)
declare @str1 varchar (10)
declare @Cretemp decimal(12,2)
declare @Debtemp decimal(12,2)
delete from tblnewperiod
if @type='month'
begin
select @intPeriod=12
select @i=1
while @i<=@intperiod
begin
insert into tblnewperiod(id,period) values(@i,cast(@i as varchar(2))+'月')
select @i=@i+1
end

delete from TblcustomDF
insert into TblcustomDF
Select (cast( month(t1.transdate) as varchar(2)) +'月' ) as Period,T1.TransDate,T1.balance from
tblcusdetail t1 where year(t1.transdate)=@value and T1.accno=@Accno order by T1.transDate

select @i=1

Delete from TblBalance
select top 1 @balance=balance from tblcusdetail where accno=@Accno
order by transdate desc
select @Cretemp=Sum(CreditAmt),@Debtemp=sum(DebitAmt) from tblcusdetail where year(transdate)>=@value and accno=@Accno
select @balance=@balance-(@Cretemp-@Debtemp)
while @i<=@intPeriod
begin

select @str=cast(@i as varchar(2)) +'月'
Declare cursor1 cursor for
Select Period,Transdate,Balance from TblcustomDF where Period=@str order by TransDate desc
open cursor1

fetch next from cursor1 into @str1,@TransDate,@Balance
close cursor1
deallocate cursor1
insert into TblBalance Values(@str,@balance)
set @i=@i+1
end

Select P.id 顺序号, p.Period as 时期,
M.交易笔数,M.借方交易金额,M.贷方交易金额,T.baLance 余额 from
tblnewperiod p
left join ( Select (cast(month(transdate) as varchar(2))+'月') as Period,
Count(Accno)as 交易笔数,sum(DebitAmt)as 借方交易金额,sum(CreditAmt) as 贷方交易金额
from dbo.tblCusDetail where Accno=@Accno and
year(transdate)=@value
Group by (cast(month(transdate) as varchar(2))+'月')
) M
on p.period=M.Period left join Tblbalance T on p.period=T.Period order by p.id

end
 
to book523:
谢谢你的讲义。

继续听课。[:)]
 
book523万分感谢,
 
多人接受答案了。
 

Similar threads

D
回复
0
查看
2K
DelphiTeacher的专栏
D
S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
后退
顶部