以文本方式查看主题

-  Foxtable(狐表)  (http://www.foxtable.com/bbs/index.asp)
--  专家坐堂  (http://www.foxtable.com/bbs/list.asp?boardid=2)
----  [求助] SQL语句求助,结过2小时努力,还是失败  (http://www.foxtable.com/bbs/dispbbs.asp?boardid=2&id=114418)

--  作者:huangfanzi
--  发布时间:2018/2/5 22:22:00
--  [求助] SQL语句求助,结过2小时努力,还是失败
有一表,表名是 {调价表},结构如下:

生效日期      商品名   价格  合同编号
2018-1-1    商品1   100   合同1
2018-1-1    商品2   110   合同1
2018-1-15  商品1   150   合同1
2018-1-15  商品2   160   合同1

目的是用Dim rt As New prt.RenderTable生成个调价报表,生成的样子如下:

商品名  调价前单价  调价后单价
商品1      100           150
商品2      110           160

我目前的做法是 双击一个行号的行头事件,代码中有以下内容:
Dim dr As DataRow
dr = DataTables("调价表").SQLFind("生效日期 < \'" & e.Row("生效日期") & "\' And 合同编号 = \'" & e.Row("合同编号") & "\'","生效日期 Desc")
通过上面的代码得到了 当前行的上一个生效日期,然后的S ELECT语句一直试不出来,老师帮我看看

cmd.CommandText = "S elect 商品名,调价前单价,调价后单价 From (S elect 商品名,单价 As 调价后单价,(S elect 单价 From {调价表} Where 合同编号 = \'" & e.Row("合同编号") & "\' And 生效日期 = #" & dr("生效日期") & "#) As 调价前单价 from {调价表} where 合同编号 = \'" & e.Row("合同编号") & "\' And 生效日期 = #" & e.Row("生效日期") & "#)"



--  作者:有点蓝
--  发布时间:2018/2/5 22:58:00
--  
Select a.商品名,a.价格 As 调价前,b.价格 As 调价后 from (Select * from {D} where 生效日期 In (Select min(生效日期) from {D} group by 商品名)) As a
Inner join (Select * from {D} where 生效日期 In (Select max(生效日期) from {D} group by 商品名)) As b on a.商品名=b.商品名

--  作者:huangfanzi
--  发布时间:2018/2/5 23:07:00
--  
老师,不能用 MIN 吧,因为如果表的内容如下:
生效日期      商品名   价格  合同编号
2018-1-1    商品1   100   合同1
2018-1-1    商品2   110   合同1
2018-1-15  商品1   150   合同1
2018-1-15  商品2   160   合同1
2018-2-15   商品1   180   合同1
2018-2-15   商品2   200   合同1

那么我想得到的结果应该是:
商品名  调价前单价  调价后单价
商品1      150           180
商品2      160           200
[此贴子已经被作者于2018/2/5 23:07:18编辑过]

--  作者:有点蓝
--  发布时间:2018/2/5 23:19:00
--  
这种无法用sql处理,用代码:http://www.foxtable.com/webhelp/index.htm?page=0000.htm
--  作者:有点甜
--  发布时间:2018/2/6 9:06:00
--  

把今天的日期加进去,就行了,不然你的逻辑有问题。

 

比如,要查找当前日期的单价,就按商品名分组,加上日期<=当前日期的条件,最后获取倒数第一条记录。

 

看看这个帖子,分组获取前n行的数据 http://www.foxtable.com/bbs/dispbbs.asp?BoardID=2&ID=113873&skin=0