注册 登录
编程论坛 SQL Server论坛

关于设置日期过滤条件的问题

qdxqiang 发布于 2016-09-27 15:24, 4042 次点击
select
      (case when  ddate>=U.dBegin then
            CASE WHEN RdRecord.bRdFlag <>0 THEN 1 ELSE -1 END ELSE 0 END) * convert(decimal(38,8),iquantity)  as iquantity,
      (case when  ddate>=U.dBegin then
            CASE WHEN RdRecord.bRdFlag <>0 THEN 1 ELSE -1 END ELSE 0 END ) * (case  Inventory.iGroupType when  0 then Null when 1 then
               iquantity/Cu_f.iChangRate else rdrecords.iNum end  )  as iNum,
      (case when  ddate>=U.dBegin then 0 else
            CASE WHEN RdRecord.bRdFlag <>0 THEN 1 ELSE -1 END  END) * convert(decimal(38,8),iquantity)  as iQCJCSL
from  
    rdrecord inner join rdrecords on rdrecord.id=rdrecords.id
             inner join inventory on rdrecords.cinvcode=inventory.cinvcode
             inner join UFSystem..UA_Period  U ON  dbo.RdRecord.dDate <=U.dEnd
---UA_Period是月结区间表,dBegin是每个月的月初日期,dEnd是每个月的月末日期。
以上代码受UA_Period表中值的限制,只能取出当月的值,跨月取不到值,而且不能取任何日期区间的值。
想达到的效果,通过什么方式替换UA_Period表,通过日期区间过滤条件,可以取到任一区间的值,日期过滤条件最好不要分成两个,而是一个日期过滤条件,从****到****区间来过滤。
本人初接触SQL代码,请各位帮助解答,谢谢!




[此贴子已经被作者于2016-9-27 15:26编辑过]

10 回复
#2
qdxqiang2016-09-27 16:05
咋没人回答呢?
#3
mywisdom882016-09-27 17:28
你这样不好回答。
你最好把你数据源表是什么,然后你要查询的结果是什么,可以把数据做成EXCL表放上来。
为什么要这样做呢?别人看到你数据是怎么存的,才知道怎么取数。才能根据你要的结果取。单看你的代码,又没数据,很难分析的。

[此贴子已经被作者于2016-9-27 17:30编辑过]

#4
qdxqiang2016-09-28 09:09
回复 3楼 mywisdom88
谢谢提醒,这个表是ERP系统中的收发存汇总表中的部分代码,逻辑有点复杂,我再重新整理一下。
#5
厨师王德榜2016-09-28 10:03
你的逻辑有点乱,没时间细看,关于跨时间段取值,我的经验是拼接字符串,比如我有一个表是叫[订单2015],还有一个表是[订单2016],我的取值日期是2015-09-01 到2016-0831 ,这就涉及到跨时间段取数了,可以设置一个变量@intYear ,让 @intYear 在 year(@rqStart) 到 year(@rqEnd)之间循环,根据@intYear 的值,拼出应该取哪个表,比如:
Declare @rqStart as datetime ,  @rqEnd as datetime
Declare @intYear as int
Declare @strSQL as nchar(2000)
Set @rqStart='2014-09-21'
Set @rqEnd='2016-09-21'
Set @intYear=year(@rqStart)
-- 先建立一个临时装数据的表 tmpTable1
Create table tmpTable1(ddbh char(10))
While @intYear<=year(@rqEnd)
    begin
        set @strSQL='insert into tmpTable1 (ddbh) select ddbh from [dd' + ltrim(str(@intYear)) + ']'
        print @strsql
        set @intYear=@intYear+1
    end
通过运行得到的拼接字串@strSQL,就可以循环把数据装入临时表了。

#6
qdxqiang2016-09-28 10:18
rdrecord表               
id-主表标识    date-日期    bRdFlag-收发标识(出为0,入为1)    bIsSTQc-库存期初标识   
1    2015-12-31                 1                                 1   
2    2016-1-13                1                                 0   
3    2016-2-5                0                                 0   
4    2016-2-11                1                                 0   
5    2016-3-10                0                                 0   
6    2016-4-12                1                                 0   
7    2016-5-11                1                                 0   
8    2016-5-28                1                                 0   
               
rdrecords表               
AutoID-子表标识    id-主表标识    cInvCode-存货编码    iquantity-数量   
1                  1                001                   10   
2                  2                002                   20   
3                  2                001                   10   
4                  3                003                   30   
5                  4                001                   20   
6                  5                002                   10   
7                  5                003                   20   
8                  5                003                   30   
9                  6                002                   10   
10                  6              003                   20   
11                  7                001                   30   
12                 8                002                   20   
               
求存货2月-4月份的收发存汇总(要得到的结果,日期区间可变动,结果也会发生变化)               
存货编码    期初数量    累计入库    累计出库    结存数量
001            20               20             0             40
002            20               10            10             20
003            0               20            80            -60
想通过一段代码达到以上效果,前期的代码是我引入系统中现有的逻辑(部分),但未解决日期过滤的问题,请高手指点,谢谢。


[此贴子已经被作者于2016-9-28 10:24编辑过]

#7
qdxqiang2016-09-28 10:23
回复 5楼 厨师王德榜
我对存储过程是小白,不太懂。实际使用时日期区间是根据日期过滤条件变动的,并不是一个固定的值,所以不能限定死日期区间。
#8
mywisdom882016-09-29 00:07
以下是引用qdxqiang在2016-9-28 10:18:05的发言:

rdrecord表                 
id-主表标识    date-日期    bRdFlag-收发标识(出为0,入为1)    bIsSTQc-库存期初标识     
1    2015-12-31               1                                 1     
2    2016-1-13                1                                 0     
3    2016-2-5                 0                                 0     
4    2016-2-11                1                                 0     
5    2016-3-10                0                                 0     
6    2016-4-12                1                                 0     
7    2016-5-11                1                                 0     
8    2016-5-28                1                                 0     
                 
rdrecords表                 
AutoID-子表标识    id-主表标识    cInvCode-存货编码    iquantity-数量     
1                  1                001                   10     
2                  2                002                   20     
3                  2                001                   10     
4                  3                003                   30     
5                  4                001                   20     
6                  5                002                   10     
7                  5                003                   20     
8                  5                003                   30     
9                  6                002                   10     
10                 6                003                   20     
11                 7                001                   30     
12                 8                002                   20     
                 
求存货2月-4月份的收发存汇总(要得到的结果,日期区间可变动,结果也会发生变化)                 
存货编码    期初数量    累计入库    累计出库    结存数量
001            20               20             0             40
002            20               10            10             20
003            0               20            80            -60
想通过一段代码达到以上效果,前期的代码是我引入系统中现有的逻辑(部分),但未解决日期过滤的问题,请高手指点,谢谢。
你2个表的逻辑设计,还真不是一般人能看懂的,觉得很深奥,但又觉得不知道你2个表分开来有什么关系。
#9
qdxqiang2016-09-29 10:30
回复 8楼 mywisdom88
呵呵,这是ERP系统中出入库表的表头和表体信息,是分成两个表的,这个我不能改动,只能从这两个表中进行取值。
#10
mywisdom882016-09-29 12:38
你把你2个表的一部分,做成EXCL表,放上来,同时,你把你要的结果,也做成EXCL表,应该不难的
#11
tlliqi2016-09-30 07:44
以下是引用厨师王德榜在2016-9-28 10:03:56的发言:

你的逻辑有点乱,没时间细看,关于跨时间段取值,我的经验是拼接字符串,比如我有一个表是叫[订单2015],还有一个表是[订单2016],我的取值日期是2015-09-01 到2016-0831 ,这就涉及到跨时间段取数了,可以设置一个变量@intYear ,让 @intYear 在 year(@rqStart) 到 year(@rqEnd)之间循环,根据@intYear 的值,拼出应该取哪个表,比如:通过运行得到的拼接字串@strSQL,就可以循环把数据装入临时表了。
这办法好
1