请教一个关于SQL的问题(200分)

  • 主题发起人 星之瀚海
  • 开始时间

星之瀚海

Unregistered / Unconfirmed
GUEST, unregistred user!
有如下格式表:
X Y VL
1 1 1
1 2 2
1 3 3
2 1 4
2 2 5
2 3 6
3 1 7
3 2 8
3 3 9
能不能通过SQL语句对VL字段形成一个这样的矩阵:
x 1 2 3
y
1 1 2 3
2 4 5 6
3 7 8 9
请各位大侠一定解决,本人给以高分
 
看不懂什么意思,是想把vl字段的内容按顺序赋值给一个不定长二维表吗?
 
是通过x,y使vl中的值构成一个二维表,就是您上面说的意思
 
数据库oracle?sqlserver?
 
不过这个二维表是按一维的方式存储的,是不是?
还有你的x,y位置是不是要调一下,我看怎么不和表中的内容对应呀
 
select y,sum(decode(x,1,vl,0)) x1,sum(decode(x,2,vl,0)) x2,sum(decode(x,3,vl,0)) x3
from tb1
group by y
 
ok了吗?
 
还没有,如果我并不知道有几维怎么办,也就是x,y都不一定,有没有动态解决的办法?
谢谢
 
维数要通过 x,y 的最大值来定。
不同维数的通过 SQL 应该很难。
 
你有没有搞错?是不是应该这样:(x,y轴搞错)
y 1 2 3
x
1 1 2 3
2 4 5 6
3 7 8 9
 
一定请各位多多帮忙,很急,在我的潜意识中,总觉得应该能实现
 
to sunrainwang:
不好意思,就是你说的那样,我也试了,你给的办法可以达到这种效果,
但我的x,y轴的维数可能是不确定的,有没有办法?
 
我是用三层结构,两层道理一样
procedure Tform1.Button1Click(Sender: TObject);
var
sql,sql0,sql1,sql2:string;
i:integer;
begin
i:=1;
sql0:='select y ';
sql1:='';
with CDS_XLIST do //CDS_XLIST为select distinct x from tb1 ;
begin
first;
while not eof do
begin
sql1 := sql1 + ',sum(decode(x,' +
CDS_XLIST.fieldbyname('X').asstring +
',vl,0)) x'+ inttostr(i) +' ';
i:=i + 1;
next;
end;
sql2 := 'from tb1 group by y;
end;

sql := sql0 + sql1 + sql2 ;

Memo1.Text:=sql;//测试sql的正确性
CDS_jxjhtj_jyxm.close;
CDS_jxjhtj_jyxm.commandtext:=sql;//两层对sqlstring赋值
CDS_jxjhtj_jyxm.open;
end;
 
按照这个思路肯定可以的,试试看![:)]
 
对不起,应该XY轴对调:

procedure Tform1.Button1Click(Sender: TObject);
var
sql,sql0,sql1,sql2:string;
i:integer;
begin
i:=1;
sql0:='select x ';
sql1:='';
with CDS_YLIST do //CDS_XLIST为select distinct Y from tb1 ;
begin
first;
while not eof do
begin
sql1 := sql1 + ',sum(decode(y,' +
CDS_XLIST.fieldbyname('Y').asstring +
',vl,0)) y'+ inttostr(i) +' ';
i:=i + 1;
next;
end;
sql2 := 'from tb1 group by x;
end;

sql := sql0 + sql1 + sql2 ;

Memo1.Text:=sql;//测试sql的正确性
CDS_xy.close;
CDS_xy.commandtext:=sql;//两层对sqlstring赋值
CDS_xy.open;
end;
 
三维的情况:
select X,sum(decode(Y,1,vl,0)) x1,sum(decode(Y,2,vl,0)) x2,sum(decode(Y,3,vl,0)) x3
from tb1
group by X
 
to sunrainwang :
您提供的方法是利用循环,这个我也想到了,可能真的是没有办法单单通过SQL来实现了,不过
还是要多谢各位大侠了!散分了
 
再散,刚才忘了
 
多人接受答案了。
 
顶部