急,高分请教数据库问题(200分)

  • 主题发起人 主题发起人 prog2001
  • 开始时间 开始时间
P

prog2001

Unregistered / Unconfirmed
GUEST, unregistred user!
数据库请教

SYBASE表中字段有:站点,日期,水位
数据如下格式:
站点  日期   水位
1号站 2001-10-01 100
1号站 2001-10-02 102 
1号站 2001-10-03 101 
2号站 2001-10-01 89
2号站 2001-10-02 85 
2号站 2001-10-03 90
3号站 2001-10-01 91
3号站 2001-10-02 92 
3号站 2001-10-03 90

希望按以下格式在dbgrid中,比较显示各站的水位:
日期    1号站 2号站 3号站
2001-10-01 100   89   91
2001-10-02 102   85   92
2001-10-03 101 90 90

我是用多次SQL取数据,用stringgrid实现,但感觉不理想,
速度也慢。(已答区里好像有类似的问题,但回答我不满意)
请问有何更好方法实现?SQL语句不知有什么技巧可利用,
最快的方法是什么?
谢谢了
 
//表名:A123;站点:KEHU,日期:RQ,水位:NUM
SELECT DISTINCT(t1.RQ)
(SELECT sum(num) FROM a123 t WHERE t.KEHU='1号站' and t.kehu=t1.kehu) as 1号站,
(SELECT sum(num) FROM a123 t WHERE t.KEHU='2号站' and t.kehu=t1.kehu) as 2号站,
(SELECT sum(num) FROM a123 t WHERE t.KEHU='3号站' and t.kehu=t1.kehu) as 3号站,
FROM a123 t1
GROUP BY kehu
ORDER BY kehu //通过
 
每天只有一个水位,所以没有必要用sum吧,直接选出来就是了,这样快点
 
//表名:A123;站点:KEHU,日期:RQ,水位:NUM
SELECT DISTINCT(t1.RQ)
(SELECT num FROM a123 t WHERE t.KEHU='1号站' and t.kehu=t1.kehu) as 1号站,
(SELECT num FROM a123 t WHERE t.KEHU='2号站' and t.kehu=t1.kehu) as 2号站,
(SELECT num FROM a123 t WHERE t.KEHU='3号站' and t.kehu=t1.kehu) as 3号站,
FROM a123 t1
GROUP BY kehu
ORDER BY kehu //通过
 
我用delphi中的sql explorer中使用上述语句,显示:
General SQL error。
ct_cursor(CLOSE):user api layer:external error:A cursor must be
opened befor this command type can be intialized.
我对SQL一点都不熟,见笑了,我输入的是:
select distinct(t1.dt)
(select z from dbo.dz t where t.stcd='50104900' and t.stcd=t1.stcd) as 111,
(select z from dbo.dz t where t.stcd='63405300' and t.stcd=t1.stcd) as 222,
from dbo.dz t1
group by stcd
order by stcd
order by stcd
 
我上面的SQL语句在SQL SERVER和INTERBASE中都可以用的,
就是完颜康说的子查询中不要那个SUM就行了。

//你最后多了一个order by stcd吧,
其它的问题就看不出来了,sybase和sql server都是tsql的。
 
还有,在sql explorer里写语句,一行不能太厂,要是很长的话,得分成几行来输入,打回车
 
还是不行呀,试了一下午,老是那个错误。
把两个select子句去掉,就没错了。加上就不行。
 
What about use a Stored Procedure to process data first, and return the data
as required.
 
我这有一个问题,在本题基础上在增加一个难度,1号站、2号站、3号站。。。
如果有几十个或更多个站,那该如何查询?
本人以前作过类似的员工考勤情况,数据结构与上面站点水位表类似
当时亦是通过StringGrid实现的。
我这个问题请高手指教!
 
zdtable
zd(站点),zddate(日期),zdnum(水位)

SQL语句已在SQL2K下通过了.
SELECT DISTINCT(zddate),
(SELECT zd1.zdnum FROM zdtable zd1 WHERE zd1.zddate=zd.zddate
AND zd1.zd='1号站') AS "1号站",
(SELECT zd1.zdnum FROM zdtable zd1 WHERE zd1.zddate=zd.zddate
AND zd1.zd='2号站') AS "2号站",
(SELECT zd1.zdnum FROM zdtable zd1 WHERE zd1.zddate=zd.zddate
AND zd1.zd='3号站') AS "3号站"
FROM zdtable zd
GROUP BY zd.zddate
ORDER BY zd.zddate
 
请参考一下这个帖子
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1047431
 
按完颜康的写法,在子查询里面加上sum()试一试。
 
在SQL SERVER里调试,差不多了,有些小问题。
SYBASE里还不行,回头再说吧,谢谢大家。
 
后退
顶部