主题:用SQL有没有办法做到?
海军
[专家分:5350] 发布于 2007-10-07 23:01:00
现有一表aaa
日期 收入
2007-01-01 23.22
2007-01-02 56.23
2007-02-02 63.20
2007-02-05 52.21
2007-02-12 42.31
2007-03-09 55.55
2007-03-10 66.66
2007-08-08 33.33
求SQL语句,将以上收入按星期一、星期二。。。。星期日分组汇总,存入数组B中。
数组B格式
星期一 56.33
星期二 36.56
星期三 108.32
。。。。
请高手指点。(用VFP8)谢谢!
回复列表 (共16个回复)
沙发
cbl518 [专家分:57140] 发布于 2007-10-07 23:34:00
SELECT "星期"+IIF(DOW(日期,2)=1,"一",IIF(DOW(日期,2)=2,"二",IIF(DOW(日期,2)=3,"三",IIF(DOW(日期,2)=4,"四",IIF(DOW(日期,2)=5,"五",IIF(DOW(日期,2)=6,"六","日")))))),SUM(收入) FROM AAA GROUP BY 1 INTO ARRAY 数组B
板凳
海军 [专家分:5350] 发布于 2007-10-08 00:43:00
十分感谢cbl518老师。
学生还有个问题,按您上面的语句,如果日期不是连贯的,则生成的日期也不是按顺序的,可能生成下面的格式:
星期日 30.56
星期四 20.35
星期一 50.23
星期五 20.43
有没有办法让它们按顺序排呢(周日是第一行,周一是第二行。。。)?学生很菜,老师不要烦。
3 楼
oufeiwen [专家分:910] 发布于 2007-10-08 00:59:00
我的语句形式如下:
SELECT '星期'+subs('日一二三四五六',dow(日期)*2-1,2) as 星期,SUM(收入),dow(日期) as dow FROM date_income GROUP BY 3 INTO ARRAY 数组B
注:如果按星期一为先,应稍作变化,如下
SELECT '星期'+subs('日一二三四五六',dow(日期)*2-1,2) as 星期,SUM(收入),dow(日期[color=FF0000],2[/color]) as dow FROM date_income GROUP BY 3 INTO ARRAY 数组B
4 楼
cbl518 [专家分:57140] 发布于 2007-10-08 01:17:00
按(周日是第一行,周一是第二行。。。)顺序排(数组多了第三列,做为排序用):
* 该种型式,有的编程环境返回错误信息(我有两种环境运行错误,所以在一楼提供比较保险方式):
SELECT '星期'+SUBSTRC('日一二三四五六',dow(日期),1),SUM(收入),dow(日期) FROM AAA GROUP BY 3 ORDER BY 3 INTO ARRAY 数组B
* 用 SUBSTR(一种环境没通过) 或 SUBSTRC (两种环境没通过)函数:
日期=DATE()
?dow(日期) && 返回2
? SUBSTRC('日一二三四五六',dow(日期),1) && 始终返回“日” 错误
? SUBSTRC('日一二三四五六',2 ,1) && 返回“一”
5 楼
cbl518 [专家分:57140] 发布于 2007-10-08 01:46:00
按(周日是第一行,周一是第二行。。。)顺序排(数组多了第三列,做为排序用):
* 这是比较保险的方式:
SELECT "星期"+IIF(DOW(日期,2)=1,"一",IIF(DOW(日期,2)=2,"二",IIF(DOW(日期,2)=3,"三",IIF(DOW(日期,2)=4,"四",IIF(DOW(日期,2)=5,"五",IIF(DOW(日期,2)=6,"六","日")))))),SUM(收入),DOW(日期) FROM AAA GROUP BY 3 ORDER BY 3 INTO ARRAY 数组B
请你测试一下两种方式。
6 楼
cbl518 [专家分:57140] 发布于 2007-10-08 02:22:00
以下方式也全部通过:
SELECT '星期'+SUBSTRC('日一二三四五六',EVALUATE(STR(DOW(日期))),1), SUM(收入), DOW(日期) FROM AAA GROUP BY 3 ORDER BY 3 INTO ARRAY 数组B
7 楼
北京种子乐 [专家分:3710] 发布于 2007-10-08 02:22:00
呵呵,海军弟:
这回知道SQL厉害了吧?
这回知道cb1518老师厉害了吧?
8 楼
cbl518 [专家分:57140] 发布于 2007-10-08 02:26:00
[b][color=FF0000][size=3]各位网友:
老兄:
你们好:
帮助测试看看结果:[/size][/color][/b]
* 用 SUBSTR(一种环境没通过) 或 SUBSTRC (两种环境没通过)函数:
日期=DATE()
?dow(日期) && 返回 2
? SUBSTRC('日一二三四五六',dow(日期),1) && 始终返回“日” 错误
? SUBSTRC('日一二三四五六',2 ,1) && 返回“一”
? SUBSTRC('日一二三四五六',EVALUATE(STR(DOW(日期))),1) && 返回“一”
日期=DATE()+1
?dow(日期) && 返回 3
? SUBSTRC('日一二三四五六',dow(日期),1) && 始终返回“日” 错误
? SUBSTRC('日一二三四五六',2 ,1) && 返回“二”
? SUBSTRC('日一二三四五六',EVALUATE(STR(DOW(日期))),1) && 返回“二”
9 楼
oufeiwen [专家分:910] 发布于 2007-10-08 12:14:00
补充:在3楼用的subs()函数,系统默认了是指substr(),而不是substrc()函数,使用的是VFP6.0,其它版本的我没有认识.
10 楼
Ilikefox [专家分:5770] 发布于 2007-10-08 12:33:00
梅子论坛有大侠已经提出过,认为是双字节处理函数SUBSTRC的bug。把dow用int处理一下即可 SUBSTRC('日一二三四五六',int(dow(日期)),1)
俺的看法:认同SUBSTRC有BUG,看来是函数对第二参数的处理有毛病。
?SUBSTRC('日一二三四五六', 2, 1) && 返回“一”
?SUBSTRC('日一二三四五六', len("ab"), 1) && 返回“一”
?SUBSTRC('日一二三四五六', max(1, 2), 1) && 返回“一”
?SUBSTRC("日一二三四五六",mod(8,3),1) && 返回“一”
?SUBSTRC('日一二三四五六', 2.0, 1) && 返回“日”
?SUBSTRC("日一二三四五六", 3/2+0.5, 1) && 返回“日”
?SUBSTRC("日一二三四五六",val("2"),1) && 返回“日”
?SUBSTRC("日一二三四五六",max(1, 2.0),1) && 返回“日”
以上似乎可以看出,若第二参数为整数,则正确。有些函数的返回值是整数就可以,是带小数的就不行。像max(1,2)返回整数可以,max(1, 2.0)返回实数不行。
VFP是个弱数据类型语言,这是它最大的灵活点同时也是最大的隐患。像dow(date())、val("2"),概念上应该得到整数,我认为它们的返回值实际上是个实数。
我来回复