如何在SQL循环中循环,类似于for-each循环?

时间:2014-05-02 21:30:26

标签: sql tsql loops cursor

我倾注了许多问题和答案,但似乎无法找到适合我的解决方案。这是我想要做的:

说我有一张名为" Store"它包含商店ID,商店名称和该商店的年销售额。该企业希望每家商店在明年将其销售额提高50%,并希望计算每家商店需要达到的每月目标销售额,以使其增加50%的价值。例如,如果5号店的销售额去年有1000美元,那么明年年底的目标就是1500美元。为达到这个目标,每个月的金额需要1042美元,1084美元,1126美元...... 1500美元。

我要做的是将每个商店的12条记录插入每月计划事实'表。我试图从Store表中选择一个商店,获取年度销售额,然后在我计算每月价值的内部循环,这样我就可以将其插入到月度计划事实中。表,然后从商店表中选择下一个商店......依此类推。作为一名C#开发人员,这似乎是一项非常简单的任务,可以通过每个人来完成。风格循环与另一个' for'在里面循环。

但我不能为我的生活弄清楚如何在SQL中做到这一点。我知道临时表,但我似乎无法弄清楚如何将多行插入到我的月度计划事实中'表使用Store表中的记录,以及在循环中计算的值来确定每月计划值。我已经阅读了一些关于游标的内容,但似乎大多数人都在SQL社区中反对他们,所以我对此感到茫然。

3 个答案:

答案 0 :(得分:2)

下面的T-SQL显示了如何真正轻松获取每个商店每个月的销售目标。我在这里列了两个专栏:一个名为' salesTargetYourExample'我们有一个类似于1042,1084的模式,...用于销售目标,一个名为“linearGrowthSales”#39;我们有新的年度销售目标(例如,去年为1000个商店的1500个),并简单地看看每个月末的销售额应该达到该目标,假设线性增长。

简短的回答是,在使用数据库时总是要考虑集合和基于集合的操作。不要以循环的方式思考

-- Create the store table
create table dbo.Store
(
    storeId int not null primary key clustered,
    storeName varchar(100) not null,
    annualSales money not null
);

-- Populate the data in the store table
insert into dbo.Store(storeId,storeName,annualSales)
values (1, 'My first store', 2000),
    (5, 'Store number five', 1000),
    (6, 'The sixth store', 2500);


-- Get the sales targets for each store on a monthly basis
select s.storeId, s.storeName, months.mth,
    (s.annualSales * 0.5 * months.mth/12) + s.annualSales as salesTargetYourExample,
    s.annualSales * 1.5 * months.mth/12 as linearGrowthSales
from dbo.Store as s
cross apply
(
    values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12)
) as months(mth)

答案 1 :(得分:1)

如果您选择在SQL中执行循环,虽然它不赞成但它确实存在。这是它的完成方式。这是一个关于SQL中不特定于此问题的循环的更一般的答案。我希望有人因为某种原因而陷入困境,不能以其他方式(基于集合)受益:

Declare @intCount as int
Declare @numberOfTimes as int

WHILE @intCount <= @numberoftimes

BEGIN

--Do something repetitive

END

答案 2 :(得分:1)

Sql中你真的应该尝试避免使用循环。相反,您应该使用基于集合的方法。 This post(第一个答案)有一个很好的链接,为什么你不应该这样做,然后一个例子,可以帮助你做到这一点。请改为使用CURSOR

@paqogomez是对的:)