Access交流中心

北京 | 上海 | 天津 | 重庆 | 广州 | 深圳 | 珠海 | 汕头 | 佛山 | 中山 | 东莞 | 南京 | 苏州 | 无锡 | 常州 | 南通 | 扬州 | 徐州 | 杭州 | 温州 | 宁波 | 台州 | 福州 | 厦门 | 泉州 | 龙岩 | 合肥 | 芜湖 | 成都 | 遂宁 | 长沙 | 株洲 | 湘潭 | 武汉 | 南昌 | 济南 | 青岛 | 烟台 | 潍坊 | 淄博 | 济宁 | 太原 | 郑州 | 石家庄 | 保定 | 唐山 | 西安 | 大连 | 沈阳 | 长春 | 昆明 | 兰州 | 哈尔滨 | 佳木斯 | 南宁 | 桂林 | 海口 | 贵阳 | 西宁 | 乌鲁木齐 | 包头 |

怎么把3句Sql语句合并为1句

马喜立  发表于:2011-08-03 10:00:54  
复制

点击下载此附件 大家看附件,2个文件一样的,一个07版本一个03版本.

我要实现一个功能:给定2个日期,查询这两个日期之间的基金净值,如果该指定日无净值,则自动向前移一天,直到有净值为止,挪到头也没净值的,不要这只了. 

我现在的笨办法是:

第一步:查询1

SELECT 基金代码, Max(净值日期) AS 净值日, Max(复权净值) AS 净值20110619
FROM 基金净值
WHERE 净值日期<=#6/19/2011#
GROUP BY 基金代码;

第2步:查询2

SELECT 基金代码, Max(净值日期) AS 净值日, Max(复权净值) AS 净值20110719
FROM 基金净值
WHERE 净值日期<=#7/19/2011#
GROUP BY 基金代码;

第三部:把他们俩合并起来就得到了我需要的东西.

SELECT 查询1.基金代码, 查询1.净值日 AS 起始净值日, 查询1.净值20110619, 查询2.净值日 AS 结束净值日, 查询2.净值20110719
FROM 查询1 LEFT JOIN 查询2 ON 查询1.基金代码=查询2.基金代码;

大家最好在附件里面操作,那样看的比较清晰.

谢谢朋友们.

 

 

 

Top
煮江品茶 发表于:2011-08-03 15:11:18
马喜立 发表于:2011-08-03 16:09:48

煮江品茶 : 看了你的帖子了,但是,没找到我需要的东西啊,没不是类似的问题.

继续寻找答案中..........



煮江品茶 发表于:2011-08-03 17:21:19
告诉你的是解决这个问题的方法:“如果该指定日无净值,则自动向前移一天,直到有净值为止。”

马喜立 发表于:2011-08-04 12:36:53

仔细看了你的作品,学习到了一个 Last函数,但是,没有找到类似我第三步需要做的合并的语句.

还望高手多加指点.

 



西出阳关无故人 发表于:2011-08-04 18:22:36

试一下是否符合要求:

PARAMETERS 开始日 DateTime, 结束日 DateTime;
SELECT B.基金代码, B.净值日期之最大值 AS 日期, DLookUp("复权净值","基金净值","基金代码='" & [基金代码] & "' AND 净值日期=#" & [净值日期之最大值] & "#") AS 净值
FROM [SELECT a.基金代码, Max(a.净值日期) AS 净值日期之最大值
FROM (SELECT *
FROM 基金净值
WHERE (((基金净值.净值日期) Between 开始日 And 结束日))) AS a
GROUP BY a.基金代码]. AS B
GROUP BY B.基金代码, B.净值日期之最大值, DLookUp



西出阳关无故人 发表于:2011-08-04 18:23:41
PARAMETERS 开始日 DateTime, 结束日 DateTime;
SELECT B.基金代码, B.净值日期之最大值 AS 日期, DLookUp("复权净值","基金净值","基金代码='" & [基金代码] & "' AND 净值日期=#" & [净值日期之最大值] & "#") AS 净值
FROM [SELECT a.基金代码, Max(a.净值日期) AS 净值日期之最大值
FROM (SELECT *
FROM 基金净值
WHERE (((基金净值.净值日期) Between 开始日 And 结束日))) AS a
GROUP BY a.基金代码]. AS B
GROUP BY B.基金代码, B.净值日期之最大值, DLookUp("复权净值","基金净值","基金代码='" & [基金代码] & "' AND 净值日期=#" & [净值日期之最大值] & "#")

西出阳关无故人 发表于:2011-08-04 18:46:07

刚才的回复只得到指定期间的最大日的数据

修正如下后,可以得到完整的结果:

select b.基金代码,b.最小日,DLookUp("复权净值","基金净值","基金代码='" & [基金代码] & "' AND 净值日期=#" & 最小日 & "#") AS 最小日净值 ,b.最大日,DLookUp("复权净值","基金净值","基金代码='" & [基金代码] & "' AND 净值日期=#" & 最大日 & "#") AS 最大日净值 from
(SELECT a.基金代码, Min(a.净值日期) AS 最小日, Max(a.净值日期) AS 最大日
FROM (SELECT *
FROM 基金净值
WHERE (((基金净值.净值日期) Between 开始日 And 结束日))) AS a
GROUP BY a.基金代码) as b

另外:你的方法好像得到的结果不正确,可以自己核对一下



马喜立 发表于:2011-08-05 00:01:22

西出阳关无故人 ,你真厉害,搞定了, 我之前的方法不对,后来发现了
SELECT 基金代码, Max(净值日期) AS 净值日, Max(复权净值) AS 净值20110619
FROM 基金净值
WHERE 净值日期<=#6/19/2011#
GROUP BY 基金代码;
在这里面的Max(复权净值)不对, 针对这事情,我还得问你一个
Dlookup 能不能换成其他的函数? 因为我在程序里面用的是ADO 操作的不是本数据库,而是其他数据库.

谢谢,太感谢了,您有什么问题,咱也一起探讨吧.


tylerma3223

 



马喜立 发表于:2011-08-05 00:10:02

还有一点 你 Min(a.净值日期) AS 最小日 这句话不符合我的实际情况,比如选了某日是周六,周六没有基金净值的,不是往后推到周一,而是往前推到周五.

所以,最小日有可能比 Min(a.净值日期) 小一两天,要是放国庆会更多,

劳烦你再帮帮我,我也深度研究一下你的语句,

PARAMETERS 刚跟你学习了这个命令.



西出阳关无故人 发表于:2011-08-05 15:55:49

1、Dlookup可以用子查询代替

2、最小日如果也是往前推,相对要麻烦很多:比如你允许前推多少天呢,例如7天,那么如果找不到指定开始日的某代码的记录,还得到指定开始日之前的7天中去找,如果也没有找到,就不要他。



马喜立 发表于:2011-08-05 16:55:37

我之前用 Max(净值日期)  WHERE 净值日期<=#6/19/2011# 两方面来确定最小日,没写范围 ,这个没有范围一直往前找,找不到就没法算它的增长率,也就不要这只基金了.因为市场上900多只基金情况不一样,虽然一般的基金每个交易日公布一次净值,但有的基金净值间断很大,一两个月也有可能,

 

 

您先帮我把Dlookup换掉,其他的我再想办法.


 



总记录:11篇  页次:1/1 9 1 :