主题:求sql语句
triumph
[专家分:160] 发布于 2006-05-07 08:36:00
业务:收取思想汇报,每交一篇,记录学号,递交时间,收取人
表1 表2
学号 |递交时间 | 收取人 学号|姓名|班级|联系方式|
11 2002-02-02 admin 11 ysl aa 123
11 2003-02-02 qq
我想查询 递交时间在 t1和t2之间 而且递交篇数<= x 的学生的学号,姓名,班级,篇数(其中t1,t2,x是参数)
回复列表 (共12个回复)
沙发
sunriver [专家分:1330] 发布于 2006-05-08 14:07:00
select 学号,姓名,班级,count(*) as 篇数 from(select * from 表2 join 表1 on 表2.学号=表1.学号 where 递交时间 between t1 and t2)Temp group by 学号,姓名,班级 having count(*)<=x
板凳
triumph [专家分:160] 发布于 2006-05-08 19:55:00
我依样画葫芦,但程序还是错误啊,请再帮我看一下啊!错误在红体字部分
with query4 do
begin
sql.Clear;
sql.Add('select xh 学号,xm 姓名,bj 班级,count(*) 篇数 [color=FF0000]from(select [/color]* from t_info join t_report1 on t_info.xh=t_report1.xh where sj between :sj1 and :sj2)temp') ;
sql.add('group by xh,xm,bj');
sql.add('having count(*)<:ps');
parambyname('sj1').AsDateTime:=datetimepicker1.DateTime;
parambyname('sj2').AsDateTime:=datetimepicker2.DateTime;
parambyname('ps').Value:=strtoint(rzedit1.Text);
open;
3 楼
sunriver [专家分:1330] 发布于 2006-05-09 12:21:00
a
4 楼
triumph [专家分:160] 发布于 2006-05-09 13:23:00
我也不知道什么原因,是不是不兼容这样的语句啊
5 楼
triumph [专家分:160] 发布于 2006-05-09 13:39:00
错误原因"Invalid use of keyword"
token:select
6 楼
sunriver [专家分:1330] 发布于 2006-05-09 15:20:00
with query4 do
begin
sql.Clear;
sql.Add('select xh 学号,xm 姓名,bj 班级,count(*) 篇数 from(select * from t_info join t_report1 on t_info.xh=t_report1.xh where sj between :sj1 and :sj2)temp ') ;
sql.add(' group by xh,xm,bj ');
sql.add(' having count(*)<:ps ');
parambyname('sj1').AsDateTime:=datetimepicker1.DateTime;
parambyname('sj2').AsDateTime:=datetimepicker2.DateTime;
parambyname('ps').Value:=strtoint(rzedit1.Text);
open;
在试试
7 楼
triumph [专家分:160] 发布于 2006-05-09 17:37:00
语句好象没有变化啊
8 楼
wbc6 [专家分:150] 发布于 2006-05-09 19:04:00
delphi 只支持简单的sql语句,好象不支持join 和 temp这些应用吧。
9 楼
sunriver [专家分:1330] 发布于 2006-05-10 11:15:00
1、两个SQL语句有区别.sql.add(' group by xh,xm,bj ');中的前或后要加空格,否则SQL语句有可能运行出来是错的。
sql.add('group by xh,xm,bj');
sql.add('having count(*)<:ps');
运行出来的结果可能是:group by xh,xm,bjhaving count(*)<:ps
2、delphi可以支持任何复杂的SQL语句。只要能在对应的数据库中能执行的SQL 语句,在Delphi都可以用。
别说是join on语句了,就算是游标、存储过程等都可以执行。
10 楼
sunriver [专家分:1330] 发布于 2006-05-10 11:32:00
你用的是什么数据库!如果是SQL Server用事件探查器 跟一下吧。看看最终的SQL语句是什么!
错误可能出在SQL的参数,
你不用参数直接付值试试。
with query4 do
begin
sql.Clear;
sql.Add('select xh 学号,xm 姓名,bj 班级,count(*) 篇数 from(select * from t_info join t_report1 on t_info.xh=t_report1.xh where sj between '+QuotedStr(DateToStr(datetimepicker1.DateTime))+' and '+QuotedStr(DateToStr(datetimepicker2.DateTime))+' ')temp ') ;
sql.add(' group by xh,xm,bj ');
sql.add(' having count(*)<'+Trim(rzedit1.Text)+' ');
open;
end;
我可以担保我写的SQL语句不可能有问题。
我来回复