首先对不起,如果我的英语水平不高: - )
我需要一些SQL Server查询的帮助...(我在SQL中有点新的东西)。
我在某些产品的特定日期(一天)有一张产品库存表。如果没有库存变动,不是每天都有库存记录。这是我的表:
Table : Stocks
Columns : ProductCode | Date | Stock |
每次我们进行库存移动时,我们都会添加一个新行,因此很可能在很多产品代码中找到了记录中的记录
如果我需要特定日期的产品库存,这是我的SQL查询
Date : 1-4-2016
Product : bm500w
select top 1 stock
from stocks
where productcode = 'bm500w'
and Date <= '1-4-2016'
order by Date desc
此查询正在运行,但我有一个新的&#34;首席请求&#34;。我需要一个查询来查看过去30天内特定产品的库存。
查询应为:
select top 1 ProductCode,
(select top 1 Stock from Stocks where ProductCode = mv.ProductCode
and Date <= getdate()-1 order by Date desc) as Dia1,
(select top 1 Stock from Stocks where ProductCode = mv.ProductCode
and Date <= getdate()-2 order by Date desc) as Dia2,
(select top 1 Stock from Stocks where ProductCode = mv.ProductCode
and Date <= getdate()-29 order by Date desc) as Dia29,
(select top 1 Stock from Stocks where ProductCode = mv.ProductCode
and Date <= getdate()-30 order by Date desc) as Dia30
from Stocks mv
where mv.ProductCode = 'bm500w'
我确定此查询有效,但我确信,确定有更好的,优化的&#34;,方法或代码可以获得相同的结果。
答案 0 :(得分:0)
我建议您使用union,但是您可以使用相同的方法使用join。
declare @sqlStr nvarchar(max) = ';with cte as (' + char(13)
declare @i int = 1
while @i <= 30
begin
set @sqlStr = @sqlStr +
'select top 1 Stock as Dia from Stocks where ProductCode = mv.ProductCode and Date <= getdate() - ' + cast(@i as varchar) + ' order by Date desc' + CHAR(13)
if (@i < 30)
set @sqlStr = @sqlStr + 'union all' + CHAR(13)
set @i = @i + 1
end
set @sqlStr = @sqlStr + ')' + CHAR(13) + 'select top 1 ProductCode, cte.Dia from Stocks mv inner join cte on cte.ProductCode = mv.ProductCode where mv.ProductCode = @prdCode'
print @sqlStr
exec sp_executesql @sqlStr, N'bm500w'
注意:强> 当我在第一个语句中使用@i时,我认为可能存在SQL注入的风险,因此如果您担心安全性,请注意这一点。
如果帖子已回答问题
,请“标记为答案”