这个SQL怎么写? 关于取坐标的问题。(200分)

  • 主题发起人 主题发起人 wumeng
  • 开始时间 开始时间
W

wumeng

Unregistered / Unconfirmed
GUEST, unregistred user!
表结构如下XX,YY,mData.表名就定为TableA 吧。XX,YY同时为关键字。
有如下的数据
XX YY mData
1 1 1
1 2 2
1 3 3
1.5 1 1.5
1.5 2 2.5
2 1 3
2 2 4
2 3 36

我要把上面的数据按XX坐标排列后,形成字符串,如果该坐标YY为空值,则用--代替。
上面的结果就是
XX 1 1.5 2
YY1 1 1.5 3
YY2 2 2.5 4
YY3 3 -- 36

注:上面的YY1,YY2,YY3一定是整数,但XX不一定。(YY1表示YY=1时,YY2表示YY=2)
不知道我说明白了没有。
 
看是看明白了
不过一个SQL应该搞不定,还是写个存储过程,并把中间结果打到一个临时表,再从这个临时表里取数据吧
而且临时表的结构应该也是纵向的(跟你最终显示刚好倒转),即XX, YY1, YY2, YY3是列
然后XX的值即是select distinct XX from table1
然后再找到YY1, YY2, YY3的值。
 
提供一个思路,但没搞定,希望大家把它弄出来

CREATE PROCEDURE [Proc_cursor] AS
declare @xx varchar(5)
declare @sql varchar(2000)
declare cr cursor for select cast(xx as varchar(5)) from tcursor
group by xx order by xx
set @sql='select'
open cr
fetch next from cr into @xx
while @@fetch_status<>-1
begin
set @sql=@sql+'select sum(yy),sum(mdata) from tcursor where xx='+@xx+
' group by xx) as'+@xx
fetch next from cr into @xx
end
close cr
deallocate cr
exec(@sql)
 
多少句SQL我倒不在乎,关键是有没有好的办法,或者高效率的方法。。。
 
我建的表中的字段都是varchar(10),运行通过,不知合不合用
if exists(select * from sysobjects where type='P' and name='RowToCol')
drop procedure RowToCol
go
create procedure RowToCol as
begin
declare @create varchar(4000)
declare @ins varchar(1000)
select @create='create table #temp (columnXX varchar(10)',@ins='insert into #temp values(''XX'''
declare @XX varchar(10)
declare xx_cursor cursor for select distinct XX from TableA order by XX
open xx_cursor
fetch next from xx_cursor into @XX
while @@fetch_status = 0
begin
select @create=@create+',[column'+@XX+'] varchar(10) default(''--'')',@ins=@ins+','+@XX
fetch next from xx_cursor into @XX
end
close xx_cursor
deallocate xx_cursor
select @create=@create+')',@ins=@ins+')'

declare @YY varchar(10),@DATA varchar(10)
declare @OldYY varchar(10),@values varchar(1000)
declare yy_cursor cursor for select YY,XX,mData from TableA order by YY
open yy_cursor
fetch next from yy_cursor into @YY,@XX,@DATA
while @@fetch_status = 0
begin
if @oldYY=@YY
select @ins=@ins+',[column'+@XX+']', @values=@values+','+@DATA
else
begin
if @oldYY is not null
select @ins=@ins+')'+@values+')'+char(13)+'insert into #temp(columnXX,[column'+@XX+']',@values=' values(''YY'+@YY+''','+@DATA
else
select @ins=@ins+char(13)+'insert into #temp(columnXX,[column'+@XX+']',@values=' values(''YY'+@YY+''','+@DATA
end
select @oldYY=@YY
fetch next from yy_cursor into @YY,@XX,@DATA
end
close yy_cursor
deallocate yy_cursor
select @ins=@ins+')'+@values+')'
print @create
print @ins
exec(@create+@ins+'select * from #temp')
end
go
RowToCol
 
就是按xx,yy字段作交叉表(交叉点数据为mdata)吧,
用一条sql好象是不行的(看过人家在access中实现过,用到了一条access的特殊sql,
但那也有限制,就是xx或yy的字段值是固定的几个).

俺做过这样的交叉表控件,可以实现你的要求,直接用select * from tablea,然后接上
我的控件,可以从这个查询的数据集再生成一个数据集,结果就是你要的.用起来还算很简单.
我的网站到期了,不过你可以看一下说明合不合用
http://www.lotus-soft.com/51bcb/text/view-text.asp?btype=0&amp;id=12
 
先做成竖的(group by xx),再把它转过来。
 
谢谢大家,我先看看。
 
To lynu
你的元件下载不了呀。。。只能看到说明书。。。

To qianwt,
我正在试用你的,估计明天就能出来结果。。。
 
我改了一下qianwt, 的,成功了。谢谢!!!
 

Similar threads

S
回复
0
查看
730
SUNSTONE的Delphi笔记
S
S
回复
0
查看
738
SUNSTONE的Delphi笔记
S
S
回复
0
查看
681
SUNSTONE的Delphi笔记
S
S
回复
0
查看
768
SUNSTONE的Delphi笔记
S
后退
顶部