我倾注了许多问题和答案,但似乎无法找到适合我的解决方案。这是我想要做的:
说我有一张名为" Store"它包含商店ID,商店名称和该商店的年销售额。该企业希望每家商店在明年将其销售额提高50%,并希望计算每家商店需要达到的每月目标销售额,以使其增加50%的价值。例如,如果5号店的销售额去年有1000美元,那么明年年底的目标就是1500美元。为达到这个目标,每个月的金额需要1042美元,1084美元,1126美元...... 1500美元。
我要做的是将每个商店的12条记录插入每月计划事实'表。我试图从Store表中选择一个商店,获取年度销售额,然后在我计算每月价值的内部循环,这样我就可以将其插入到月度计划事实中。表,然后从商店表中选择下一个商店......依此类推。作为一名C#开发人员,这似乎是一项非常简单的任务,可以通过每个人来完成。风格循环与另一个' for'在里面循环。
但我不能为我的生活弄清楚如何在SQL中做到这一点。我知道临时表,但我似乎无法弄清楚如何将多行插入到我的月度计划事实中'表使用Store表中的记录,以及在循环中计算的值来确定每月计划值。我已经阅读了一些关于游标的内容,但似乎大多数人都在SQL社区中反对他们,所以我对此感到茫然。
答案 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)