我正在为我们公司建立一个采购/再订购计划算法。给定以下数据集,我如何选择具有最高组合值的6个月期间?(例如1-6月、2-7月、3-8月、4-9月等)
║ January ║ February ║ March ║ April ║ May ║ June ║ July ║ August ║ September ║ October ║ November ║ December ║
║ 5 ║ 2 ║ 6 ║ 2 ║ 5 ║ 4 ║ 8 ║ 5 ║ 6 ║ 4 ║ 3 ║ 2 ║显然,这可以通过下面的代码来实现,但我希望代码更灵活一些,这样我就可以根据需要更改6或12的值。
(SELECT MAX(Details.Quantity)
FROM
(VALUES
SUM(January, February, March, April, May, June),
SUM(February, March, April, May, June, July),
SUM(March, April, May, June, July, August),
SUM(April, May, June, July, August, September),
SUM(May, June, July, August, September, October),
SUM(June, July, August, September, October, November),
SUM(July, August, September, October, November, December)
) AS Details(Quantity))
AS Max发布于 2017-12-11 08:36:31
Cat先生是对的,下面是支持这一点的SQL。
我创建了一个表MonthIds,它基本上是12行一月=> 1,二月=> 2....12月=> 12
此外,上面的数据最好以行而不是列的形式表示,下面的示例unpivot是上面的数据,如果以行的形式表示,则可以跳过取消透视
SELECT TOP 1 Month AS StartMonth
FROM (
SELECT [Month],
[Value],
SUM([value]) OVER (
ORDER BY MonthId ROWS BETWEEN CURRENT ROW
AND 6 FOLLOWING
) AS SumOverPeriod
FROM (
SELECT mi.Id AS MonthId,
[Month],
[Value]
FROM (
SELECT *
FROM [Months]
) m
UNPIVOT([Value] FOR [Month] IN (
[January],
[February],
[March],
[April],
[May],
[June],
[July],
[August],
[September],
[October],
[November],
[December]
)) AS u
JOIN [MonthIds] mi ON mi.NAME = u.Month
) a
) s
ORDER BY SumOverPeriod DESC此SQL将提供这6个月中的开始月份
您可以更改后面的和6,并将其替换为您想要的任何数字。
注意:如果您将其更改为12,则1月份将始终是第一个月。
发布于 2017-12-11 05:11:55
我可能会将月份转换为数字,并添加一个具有id和name列的表months,编号为1..12。然后,假设这是一个12个月的跟踪需求历史,我将计算每个月的跟踪6个月的需求,并选择按累计需求降序排序的前1个。
如果这是一个正在进行的事情,您可以在另一个表中累积需求,然后每月重新计算,以便您的数据是最新的。
发布于 2017-12-12 16:15:25
主要问题是,您已经询问了problem.you的一部分应该已经发布了正确的表设计,并且只有很少的示例数据。
这是同样的解决方案,适用于sql server 2008及更低版本
create table #t (January int,February int,March int,April int,May int
,June int,July int,August int,September int,October int,November int,December int)
insert into #t VALUES
(5,2,6,2,5,4,8, 5,6,4,3,2)
declare @RangeMonth int=6
;with CTE as
(
select *,ROW_NUMBER() over(order by (select null))rn
from #t
UNPIVOT([Value] FOR [Month] IN (
[January],
[February],
[March],
[April],
[May],
[June],
[July],
[August],
[September],
[October],
[November],
[December]
)) AS u
)
,CTE1 AS(
select [month], rn,value, sumValue from CTE c
cross apply
(
select sum(value) sumValue from cte c1
where c1.rn>=c.rn and c1.rn<=c.rn+@RangeMonth
)ca
)
,CTE2 AS(
select max(sumvalue)sumvalue from cte1 c1
)
,CTE3 AS(
select c.* from cte1 c
cross apply(
select sumvalue from cte2 c1 where c.sumvalue=c1.sumvalue
)ca
)
select c.* from cte1 c
cross apply(select * from cte3 c1 where c.rn>=c1.rn and c.rn<=c1.rn+@RangeMonth)ca
drop table #thttps://stackoverflow.com/questions/47743445
复制相似问题