sql - 按期间分组时带入前 12 个月的计数

标签 sql sql-server-2005 group-by case

我正在尝试使用下面的代码来计算过去 12 个月内 的所有行数。期间和植物,请看下面的输出。
例如,对于下面的输出,而不是当前包含该期间总计的 12 个月列,我希望使用 201001-201101 之间的期间进行计数(请注意,我的示例仅适用于下面的数据集和 12 个月列需要适应每个时期)。

Period    Plant Stock   Special MonthTotal  12Months
201101    0EA0    27     0          27        27
201101    0EB0    35    2           37        37

我遇到的问题是,我的代码不是通过过去 12 个月的计数,而是通过当前期间的计数。请问有人可以帮忙吗?
   select 
            convert(varchar(6),dateadd(mm,0,P.Dt),112) as Period,P.Plant,
            Sum(Case When Left(Upper(Material),2) = 'ZZ' then 1 else 0 end) as Stock,
            Sum(Case When Left(Upper(Material),2) <> 'ZZ' then 1 else 0 end) as Special
            ,Count(*) as MonthTotal,Sum(Case When 
                        convert(varchar(6),dateadd(mm,0,P.Dt),112)  
                 Between
                        convert(varchar(6),dateadd(mm,-12,P.Dt),112)    
                 And
                        convert(varchar(6),dateadd(mm,0,P.Dt),112)  Then 1 else 0 End
                )as [12Months]
    from 
            iesaonline.dbo.DS_POs  as P where  
                                Plant IN(
                    Select Client From METRICS.DBO.CO_001_Plants_090_Final
                                  where CustGrp = 'Hovis'
                                        )
    Group by 
            P.Plant,convert(varchar(6),dateadd(mm,0,P.Dt),112)                                  
    order by 
            convert(varchar(6),dateadd(mm,0,Dt),112),Plant      

最佳答案

问题似乎是您按年/月分组,并试图对该年/月范围之外的值求和。没有样本数据,我无法确定,但听起来您想要滚动 12 个月的总和。像下面这样的东西应该可以带你去你想去的地方。

;with monthlySubtotal as
    (
        select 
                dateadd(m, 1-datepart(day, p.dt), p.dt) as PeriodMonth
                ,P.Plant
                ,Sum(Case When Left(Upper(Material),2) = 'ZZ' then 1 else 0 end) as Stock
                ,Sum(Case When Left(Upper(Material),2) <> 'ZZ' then 1 else 0 end) as Special
                ,Count(*) as MonthTotal
        from 
                iesaonline.dbo.DS_POs  as P where  
                                    Plant IN(
                        Select Client From METRICS.DBO.CO_001_Plants_090_Final
                                      where CustGrp = 'Hovis'
                                            )
        Group by 
                P.Plant
                ,dateadd(m, 1-datepart(day, p.dt), p.dt)
    )
SELECT 
    convert(varchar(6),m1.PeriodMonth,112) Period
    , m1.Plant
    , m1.Stock
    , m1.Special
    , m1.MonthTotal
    , SUM(m2.monthtotal) 12mototal
FROM monthlySubtotal m1
JOIN monthlySubtotal m2
    ON m2.plant = m1.plant 
    AND m2.periodmonth BETWEEN dateadd(m, -11, m1.periodmonth)
        AND m1.periodmonth
--You may want to filter this
--WHERE m1.periodmonth >= startdate
GROUP BY 
    convert(varchar(6),m1.PeriodMonth,112) 
    , m1.Plant
    , m1.Stock
    , m1.Special
    , m1.MonthTotal
ORDER BY 
    Period
    , Plant

关于sql - 按期间分组时带入前 12 个月的计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33709740/

相关文章:

sql - Postgres 窗口函数语法

sql - 根据计数有条件地将记录插入多线程环境中的表中

sql-server - sql存储过程参数作为动态查询的参数

sql-server - Sql Server 性能和字段顺序

mysql - Rails group_by 总金额

mysql - 如何计算 MySQL 中 NULL 运行的运行长度?

sql - CTE中查询的计算字段很慢,如何优化

mysql - 如何从 MySQL 表中获取最新的可用数据集(数据集每天存储)?

sql-server - 使用 SQL 中的总和和计数按相同范围的多个值进行分组

sql - 如何从包含单引号的oracle数据库中搜索数据