回 帖 发 新 帖 刷新版面

主题:用SQL有没有办法做到?

现有一表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个回复)

沙发

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

板凳

十分感谢cbl518老师。
学生还有个问题,按您上面的语句,如果日期不是连贯的,则生成的日期也不是按顺序的,可能生成下面的格式:
星期日   30.56
星期四  20.35
星期一  50.23
星期五  20.43
有没有办法让它们按顺序排呢(周日是第一行,周一是第二行。。。)?学生很菜,老师不要烦。

3 楼

我的语句形式如下:
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 楼

按(周日是第一行,周一是第二行。。。)顺序排(数组多了第三列,做为排序用):

* 该种型式,有的编程环境返回错误信息(我有两种环境运行错误,所以在一楼提供比较保险方式):
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 楼

按(周日是第一行,周一是第二行。。。)顺序排(数组多了第三列,做为排序用):
* 这是比较保险的方式:
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 楼

以下方式也全部通过:

SELECT '星期'+SUBSTRC('日一二三四五六',EVALUATE(STR(DOW(日期))),1), SUM(收入), DOW(日期) FROM AAA GROUP BY 3 ORDER BY 3 INTO ARRAY 数组B

7 楼

呵呵,海军弟:
这回知道SQL厉害了吧?
这回知道cb1518老师厉害了吧?

8 楼

[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 楼

补充:在3楼用的subs()函数,系统默认了是指substr(),而不是substrc()函数,使用的是VFP6.0,其它版本的我没有认识.

10 楼

梅子论坛有大侠已经提出过,认为是双字节处理函数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"),概念上应该得到整数,我认为它们的返回值实际上是个实数。

我来回复

您尚未登录,请登录后再回复。点此登录或注册