我如何在SQL中做循环中的循环,类似于for-each循环



我仔细研究了许多问题和答案,但似乎找不到适合我的解决方案。下面是我要做的:

假设我有一个名为"Store"它包含商店id、商店名称和该商店的年销售额。企业希望每家门店在下一年的销售额增加50%,并希望计算每家门店需要达到的每月目标销售额,以实现50%的增长价值。例如,如果5号店去年的销售额为1000美元,那么明年年底的目标将是1500美元。要达到这个目标,每个月需要1042美元、1084美元、1126美元……1500美元。

我要做的是为每个商店插入12条记录到'月度计划事实'表中。我试图从商店表中选择一家商店,获取年销售额,然后在其中进行循环,计算每个月的值,以便将其插入"月度计划事实"表中,然后从商店表中选择下一家商店……等等......作为c#开发人员,这似乎是一个非常简单的任务,可以通过'for each'样式的循环和另一个'for'循环来完成。

但是我不能为我的生活弄清楚如何在SQL中做到这一点。我知道临时表,但我似乎不知道如何使用Store表中的记录将多行插入到我的"月度计划事实"表中,并在循环中计算值以确定月度计划值。我读过一些关于游标的文章,但似乎大多数人在SQL社区中都不建议使用游标,所以我对这篇文章感到茫然。

下面的T-SQL显示了如何真正轻松地获得每个商店每个月的销售目标。我在这里包含了两个列:一个叫做"salestargetyoureexample",其中我们有1042、1084、……一个是"线性增长销售",其中我们有新的年度销售目标(例如,去年销售额为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)

Sql中,你真的应该尽量避免使用循环。相反,您应该使用基于集合的方法。这篇文章(第一个答案)有一个很好的链接,告诉你为什么不应该这样做,然后是一个可以帮助你这样做的例子。看一下如何使用CURSOR。

@paqogomez是对的:)

如果您选择在SQL中执行循环,虽然它不受欢迎,但它确实存在。下面是怎么做的。这是一个关于SQL循环的更一般的答案,不是针对这个问题的。我希望那些因为任何原因不能走另一条路的人可以受益:

Declare @intCount as int
Declare @numberOfTimes as int
WHILE @intCount <= @numberoftimes
BEGIN
--Do something repetitive
END

最新更新