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天缺货率
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+''')
(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 后面就直接加个@sql?
[其他解释]
拼接字符串?
[其他解释]
什么办法都行。能实现就可以。现在就是语句太长了。
3.
select (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天缺货率
[其他解释]
发帖的这个例子可能不太清楚。
你可以看下3楼的例子。应该能说明我的问题和需求
[其他解释]
更简便的方法,是用6个语句,分别从数据库里求出统计值,然后在你的程序里去求除法.
兄弟,要学会变通.
[其他解释]
SELECT sum(b.arvqty*b.price)/sum(b.qty*b.price) 节前后30天订单满足率,
sum(CASE WHEN a.fildate>@jk THEN 0 ELSE b.arvqty END*b.price)/sum
(CASE WHEN a.fildate>@jk THEN 1 ELSE b.qty END*b.price) 节前15天订单满足率
,sum(CASE WHEN a.fildate<@jj THEN 0 ELSE b.arvqty END*b.price)/sum
(CASE WHEN a.fildate<@jj THEN 1 ELSE b.qty END*b.price) 节后15天订单满足率 FROM t_ord a,t_orddtl b
WHERE a.fildate BETWEEN dateadd(dd,-15,@jk) AND dateadd(dd,15,@jj)
AND a.num=b.NUM
DECLARE @qk datetime,@jk datetime
DECLARE @qj datetime,@jj datetime
SET @qk='2011-06-21'SET @jk='2012-06-21'
SET @qj='2011-06-23'SET @jj='2012-06-22'
DECLARE @WHERE1 NVARCHAR(MAX),@WHERE2 NVARCHAR(MAX),@WHERE3 NVARCHAR(MAX)
SELECT @WHERE1='CONVERT(datetime,srq,112)BETWEEN dateadd(dd,-15,@jk) AND @jk' ,
@WHERE2='CONVERT(datetime,srq,112)BETWEEN @jj AND dateadd(dd,15,@jj)' ,
@WHERE3='CONVERT(datetime,srq,112)BETWEEN dateadd(dd,-15,@jk) AND dateadd(dd,15,@jj)'
EXEC (N'SELECT (SELECT sum(nqhje) FROM t_qhb WHERE '+@WHERE1+')
/
(SELECT sum(nchje) FROM t_chb WHERE '+@WHERE1+') AS 节前15天缺货率
,
(SELECT sum(nqhje) FROM t_qhb WHERE '+@WHERE2+')
/ (SELECT sum(nchje) FROM t_chb WHERE '+@WHERE2+') AS 节后15天缺货率 ,
(SELECT sum(nqhje) FROM t_qhb WHERE '+@WHERE3+')
/ (SELECT sum(nchje) FROM t_chb WHERE '+@WHERE3+') AS 前后30天缺货率')
消息 137,级别 15,状态 2,第 1 行
必须声明标量变量 "@jk"。
消息 137,级别 15,状态 2,第 3 行
必须声明标量变量 "@jk"。
消息 137,级别 15,状态 2,第 5 行
必须声明标量变量 "@jj"。
消息 137,级别 15,状态 2,第 6 行
必须声明标量变量 "@jj"。
消息 137,级别 15,状态 2,第 7 行
必须声明标量变量 "@jk"。
消息 137,级别 15,状态 2,第 8 行
必须声明标量变量 "@jk"。
DECLARE @WHERE1 NVARCHAR(MAX),@WHERE2 NVARCHAR(MAX),@WHERE3 NVARCHAR(MAX)
SELECT @WHERE1='CONVERT(datetime,srq,112)BETWEEN?dateadd(dd,-15,@jk)?AND?@jk'
,@WHERE2='CONVERT(datetime,srq,112)BETWEEN?@jj?AND?dateadd(dd,15,@jj)'
,@WHERE3='CONVERT(datetime,srq,112)BETWEEN?dateadd(dd,-15,@jk)?AND?dateadd(dd,15,@jj)'
EXEC (N'SELECT?(SELECT?sum(nqhje)?FROM?t_qhb?WHERE?
'+@WHERE1+')
/
(SELECT?sum(nchje)?FROM?t_chb?WHERE?
'+@WHERE1+')?AS?节前15天缺货率
,
(SELECT?sum(nqhje)?FROM?t_qhb?WHERE?
'+@WHERE2+')
/
(SELECT?sum(nchje)?FROM?t_chb?WHERE?
'+@WHERE2+')?AS?节后15天缺货率
,
(SELECT?sum(nqhje)?FROM?t_qhb?WHERE?
'+@WHERE3+')
/
(SELECT?sum(nchje)?FROM?t_chb?WHERE?
'+@WHERE3+')?AS?前后30天缺货率'
)
DECLARE @WHERE1 NVARCHAR(MAX),@WHERE2 NVARCHAR(MAX),@WHERE3 NVARCHAR(MAX)
SELECT @WHERE1='CONVERT(datetime,srq,112)BETWEEN dateadd(dd,-15,'''+CONVERT(VARCHAR(10),@jk,112)+''') AND '''+CONVERT(VARCHAR(10),@jk,112)+'''' ,
@WHERE2='CONVERT(datetime,srq,112) BETWEEN '''+CONVERT(VARCHAR(10),@jj,120)+''' AND dateadd(dd,15,'''+CONVERT(VARCHAR(10),@jj,120)+''')' ,
@WHERE3='CONVERT(datetime,srq,112) BETWEEN dateadd(dd,-15,'''+CONVERT(VARCHAR(10),@jk,120)+''') AND dateadd(dd,15,'''+CONVERT(VARCHAR(10),@jj,120)+''')
selelct * from
(select * from table ) a,
(select * from table1 ) b,
(exec (N'SELECT (SELECT sum(nqhje) FROM t_qhb WHERE '+@WHERE1+')
/
(SELECT sum(nchje) FROM t_chb WHERE '+@WHERE1+') AS 节前15天缺货率
, (SELECT sum(nqhje) FROM t_qhb WHERE '+@WHERE2+')
/
(SELECT sum(nchje) FROM t_chb WHERE '+@WHERE2+') AS 节后15天缺货率
, (SELECT sum(nqhje) FROM t_qhb WHERE '+@WHERE3+')
/ (SELECT sum(nchje) FROM t_chb WHERE '+@WHERE3+') AS 前后30天缺货率') ) c