关于一个sql语句的问题(85分)

  • 主题发起人 主题发起人 墨剑
  • 开始时间 开始时间

墨剑

Unregistered / Unconfirmed
GUEST, unregistred user!
有一张表 list(id number(2,0),money number(7,2))
id money
1 2000
1 -1000
2 5000
2 -1300
3 1000
4 500
4 -700
我需要显示格式如下
id money1 money2
1 2000 1000
2 50000 13000
3 1000 0
4 500 700
 
select a.id,a.money as money1,b.money as money2 from (select id,money from list where money>0) as a,(select money from list where money<0) as b
 
按sql server的语法,可用如下语句()
select a.id,money1=a.money,money2=isnull(abs(b.money),0)
from
(select * from list where Money>0 ) a
LEFT OUTER JOIN (select * from List where Money<0) b
ON a.Id=b.id
 
select money from list where money<0
应该是 select money from list where money<=0
:)
 
你的目标是什么? sunkezai可以解决你现在的数据
但我认为你是想建立cross表,那通常两种做法,内存表或仔细查查sql
我记得有cross表生成语句
 
经典问题! [8D][:D][:D]
收藏此贴!
 
select id,sum(case when money>0 then money else 0 end) as money1,
sum(case when money<=0 then -money else 0 end) as money2
from tablename
group by id
 
sunkezai的方法我也试过,但是结果不正确
对于money 全大于0 的id(如id=3),其结果就是不是0,而是另外一个id的小于0的money
 
ugvanxk的对。
 
SELECT DISTINCT(id),
(SELECT sum(money) FROM list l WHERE l.id=l1.id and l.money>0) as money1,
(SELECT sum(money) FROM list l WHERE l.id=l1.id and l.money<=0) as money2
FROM list l1
 
湊個熱鬧:
select id,
money1=(select sum(a.money) from list a where a.id=list.id and a.money>0),
money2=(select sum(a.money) from list a where a.id=list.id and a.money<0)
from list group by id order by id
 
各位大侠:
若同ID的记录个数是不确定的呢?该怎么做了?
id money
1 2000
1 -1000
1 500
2 5000
2 -1300
2 3000
2 600
2 200
3 580
... ...

显示格式如下
id money1 money2 money3 money4 ...
1 2000 1000 500 0 ...
2 5000 1300 3000 600 ....


想了很久了,看看各位大侠有什么好办法


 
1. I think "llh_lily" is right.

2. 若同ID的记录个数是不确定的呢?该怎么做了?
It would be easier to use stored procedure, may be a temporary table to
store the info

3. What database are you using?
 
若同ID的记录个数是不确定的呢?该怎么做了?( SQL SERVER )
是不是要先求出同一ID号最多记录的数量,来确定结果显示表的字段数?

只是觉得这种办法不好,有更好的办法吗?
 
想问,负数是不是一定在第二列,所有负数转正数,对吗?
不能得到最大同ID纪录数码?
 
其实问题并不复杂,主要是数据排列有没有规律,有就好办,没有的话,你们说怎么办?
 
若同ID的记录个数是不确定的呢?该怎么做了?
TO:小花生
我们就设墨剑的表排列没有规律的吧,当然设表还有一个字段为主键:xh

xh id money
1 1 2000
2 1 1000
3 1 500
4 2 5000
5 2 1300
6 2 3000
7 2 600
8 2 200
9 3 580
10 2 300
... ... ...

若像上面一个表
显示格式如下
id money1 money2 money3 money4 ...
1 2000 1000 500 0 ...
2 5000 1300 3000 600 ....

怎么办? 希望高手们来发表下自己的点方法
 
请参考
http://www.delphibbs.com/delphibbs/dispq.asp?lid=995018
 
比较笨的办法如下(已测试通过),创建存储过程实现。
create procedure sp_cross
as
declare @FieldCount int,
@id int ,
@Money int,
@CurId int,
@RecNo int,
@i int,
@StrSql varchar(1000),
@Str_Sp varchar(10)

--获得同一id的最大记录数
select @FieldCount=max(cc) from
(select id,count(*) as cc from list group by id) as TmpCount
--根据最大记录数创建临时表,表名为:‘Tmp’+进程号
set @Str_Sp=Convert(varchar(10),@@spId)
if exists (select * from dbo.sysobjects where id = object_id(N'[Tmp_Tab'+Convert(varchar(10),@@spId)+']') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
exec ('drop table [Tmp_Tab'+@Str_Sp+']')
exec('create Table Tmp_Tab'+@Str_Sp+'(id int)')
set @i=0
while @i<@FieldCount
begin
set @StrSql='alter Table Tmp_Tab'+@Str_Sp+' add Money'+Convert(varchar(5),@i+1)+' numeric(7,2) default 0'
print @StrSql
exec(@StrSql)
set @i=@i+1
end
--向临时表插入数据
exec('insert Tmp_Tab'+@Str_Sp+'(id) select Distinct id from list')
set @CurId=0
set @RecNo=0
declare AddTag cursor for
select id,Money from List
for read only
open AddTag
fetch AddTag into @id,@Money
while (@@fetch_status<>-1)
begin
if @CurId=@Id
set @RecNo=@RecNo+1
else
begin
set @CurId=@Id
set @RecNo=1
end
set @StrSql='update Tmp_Tab'+@Str_Sp+' set Money'+convert(varchar(5),@RecNo)+'='+convert(varchar(10),abs(@Money))+ ' where id='+Convert(varchar(5),@id)
print @StrSql
exec(@StrSql)
fetch next from AddTag into @id,@Money
end
close AddTag
deallocate AddTag
--获得结果记录集
exec ('select * from Tmp_Tab'+@Str_Sp)
--清除临时表
if exists (select * from dbo.sysobjects where id = object_id(N'[Tmp_Tab'+@Str_Sp+']') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
exec ('drop table [Tmp_Tab'+@Str_Sp+']')
GO
 
岛,不用吧!
但是不可能有不确定字段数的SQL
大家说对不对!

 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
763
import
I
I
回复
0
查看
634
import
I
I
回复
0
查看
843
import
I
后退
顶部