小白自学VFP之SQL问题贴(一)

yidunzhi 2021-04-02 06:00:17
两个表recdbf和tempyf,用分组查询某年每个月各类性质的总数。
sele tempyf.*,;
sum(iif(isnull(recdbf.日期) or at("一般",recdbf.性质)=0,0,1)) as 一般,;
sum(iif(isnull(recdbf.日期) or at("重大",recdbf.性质)=0,0,1)) as 重大,;
sum(iif(isnull(recdbf.日期) or at("特大",recdbf.性质)=0,0,1)) as 特大;
from tempyf left outer join recdbf;
on tempyf.yf=month(recdbf.日期) and year(日期)=2001;
group by tempyf.yf

问题:
1、
isnull(recdbf.日期) or at("一般",recdbf.性质)=0

理解:
判断日期中是否有NULL值,有的话返回逻辑值1,无的话返回0.示例文件中的日期一般都无ISNULL,则isnull()返回0;
at("一般",recdbf.性质)如果存在性质中,返回1;那iif(0 or 1=0,0,1)返回的值是1?那如果isnull()返回值是1,at()返回值是1,则
iif(1 or 1,0,1)返回值还是1?
2、如果要在 recdbf中查询非2001年的记录,如何操作?
sele *	from  recdbf on  year(日期)!=2001


recdbf 表结构
日期 (字符) 性质(字符)
2001.03.04 一般
2002.03.04 严重
2001.02.01 一般
tempyf表结构
yf(数值型)
1
2
3
4
...全文
753 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
yidunzhi 2021-04-14
  • 打赏
  • 举报
回复
引用 5 楼 mywisdom88 的回复:
你是在哪里运行的 VFP 9.0? 上面的,都是你1楼用到的函数啊,是不是少了个(),你自己检查一下
我在VF6.0中测试, isnull(recdbf.日期) or at("一般",recdbf.性质)=0 不解:isnull()函数判断结果是否NULL值,如果是,返回TRUE即1。对吗?按楼上的说法,返回的是0?
liups 2021-04-14
  • 打赏
  • 举报
回复
VF6.0不能用,特别是涉及sql,就算是9.0也是有限支持,所以强烈建议9.0 sp2
yidunzhi 2021-04-13
  • 打赏
  • 举报
回复
继续等待。。。。。。。。。。。。。。。。
yidunzhi 2021-04-09
  • 打赏
  • 举报
回复
引用 2 楼 mywisdom88 的回复:
iif(isnull(recdbf.日期) or at("一般",recdbf.性质)=0,0,1) && 日期空或者 一般不在性质中,返回0;否则,返回1 换句话说,如果日期不是空的,返回1,也就是,不管 at("一般",recdbf.性质)=0 ,所以,你这个统计,就是有问题的
我这个统计问题在哪?请指教
mywisdom88 2021-04-07
  • 打赏
  • 举报
回复
你是在哪里运行的 VFP 9.0? 上面的,都是你1楼用到的函数啊,是不是少了个(),你自己检查一下
mywisdom88 2021-04-06
  • 打赏
  • 举报
回复
你要改成这样 IIF(ISNULL(recdbf.日期),0,IIF(AT("一般",recdbf.性质)=0,0,1))
mywisdom88 2021-04-06
  • 打赏
  • 举报
回复
iif(isnull(recdbf.日期) or at("一般",recdbf.性质)=0,0,1) && 日期空或者 一般不在性质中,返回0;否则,返回1 换句话说,如果日期不是空的,返回1,也就是,不管 at("一般",recdbf.性质)=0 ,所以,你这个统计,就是有问题的
mywisdom88 2021-04-06
  • 打赏
  • 举报
回复
or :或者的关系,只要 条件1,条件2 当中的1个是真,结果就是真 a1=.t. a2=.f. iif(a1 or a2,1,0) 返回 1 只有 a1,a2同时为 假时,结果才是假 a1=.f. a2=.f. iif(a1 or a2,1,0) 才返回0 sum(iif(isnull(recdbf.日期) or at("一般",recdbf.性质)=0,0,1)) as 一般,; sum(iif(isnull(recdbf.日期) or at("重大",recdbf.性质)=0,0,1)) as 重大,; sum(iif(isnull(recdbf.日期) or at("特大",recdbf.性质)=0,0,1)) as 特大; iif(isnull(recdbf.日期) or at("一般",recdbf.性质)=0,0,1) && 日期空或者 一般不在性质中,返回0;否则,返回1
yidunzhi 2021-04-06
  • 打赏
  • 举报
回复
引用 3 楼 mywisdom88 的回复:
你要改成这样 IIF(ISNULL(recdbf.日期),0,IIF(AT("一般",recdbf.性质)=0,0,1))
提示函数名缺少

2,723

社区成员

发帖
与我相关
我的任务
社区描述
VFP,是Microsoft公司推出的数据库开发软件,用它来开发数据库,既简单又方便。
社区管理员
  • VFP社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧