日期:2014-05-17  浏览次数:20537 次

sql语句精简问题,在线等
SELECT (SELECT sum(nqhje) FROM t_qhb WHERE 
CONVERT(datetime,srq,112)BETWEEN dateadd(dd,-15,@jk) AND @jk)
/
(SELECT sum(nchje) FROM t_chb WHERE 
CONVERT(datetime,srq,112)BETWEEN dateadd(dd,-15,@jk) AND @jk) AS 节前15天缺货率
,
(SELECT sum(nqhje) FROM t_qhb WHERE 
CONVERT(datetime,srq,112)BETWEEN @jj AND dateadd(dd,15,@jj))
/
(SELECT sum(nchje) FROM t_chb WHERE 
CONVERT(datetime,srq,112)BETWEEN @jj AND dateadd(dd,15,@jj)) AS 节后15天缺货率
,
(SELECT sum(nqhje) FROM t_qhb WHERE 
CONVERT(datetime,srq,112)BETWEEN dateadd(dd,-15,@jk) AND dateadd(dd,15,@jj))
/
(SELECT sum(nchje) FROM t_chb WHERE 
CONVERT(datetime,srq,112)BETWEEN dateadd(dd,-15,@jk) AND dateadd(dd,15,@jj)) AS 前后30天缺货率

t_qhb 缺货表 t _chb 出货表
这段sql好长,条件都重复写了。
 有什么办法能精简下语句吗?
------最佳解决方案--------------------
DECLARE @qk  datetime,@jk datetime 
,@qj  datetime,@jj  datetime 
,@str_jk VARCHAR(10),@str_jj VARCHAR(10)
 
SET @qk='2011-06-21'
SET @jk='2012-06-21'
SET @qj='2011-06-23'
SET @jj='2012-06-22'

SET @str_jk=CONVERT(VARCHAR(10),@jk,120)
SET @str_jj=CONVERT(VARCHAR(10),@jj,120)
  
 DECLARE @WHERE1 NVARCHAR(MAX),@WHERE2 NVARCHAR(MAX),@WHERE3 NVARCHAR(MAX)  
  SELECT @WHERE1='CONVERT(datetime,srq,112)BETWEEN dateadd(dd,-15,'''+@str_jk+''') AND '''+@str_jk+''''        ,
  @WHERE2='CONVERT(datetime,srq,112) BETWEEN '''+@str_jj+''' AND dateadd(dd,15,'''+@str_jj+''')'        ,
  @WHERE3='CONVERT(datetime,srq,112) BETWEEN dateadd(dd,-15,'''+@str_jk+''') AND dateadd(dd,15,'''+@str_jj+''')

------其他解决方案--------------------
建议你给出测试数据和表结构   以及你的算法  看看大家写写


光看你的语句  觉得你可以现对这两个表的数据按日期分别汇总  再关联查询处理
------其他解决方案--------------------
两个表有关联id没?
------其他解决方案--------------------
(SELECT (SELECT sum(nqhje) FROM t_qhb WHERE CONVERT(datetime,srq,112)BETWEEN @jk AND @jj
AND sspbh NOT IN (SELECT b.GDGID FROM t_ord a,t_orddtl b WHERE a.fildate BETWEEN @jk
AND @jj AND a.num=b.num))
/     
(SELECT sum(nchje) FROM t_chb WHERE CONVERT(datetime,srq,112)BETWEEN @jk AND @jj
AND sspbh NOT IN (SELECT b.GDGID FROM t_ord a,t_orddtl b WHERE a.fildate BETWEEN @jk
AND @jj AND a.num=b.num)) AS 不订货缺货率) g

像这样的感觉where后面都重复了。 能不能联合起来写一次?
------其他解决方案--------------------
2个表没关联的。就是求相同的时间段内的总金额 然后相除。
 取的条件都一样。就是2个表都要取一次。重复写感觉语句没效率
------其他解决方案--------------------
语句长不要紧,只要效率不差就行了,对于同一个表,条件并不重复.应该没办法精简.
------其他解决方案--------------------