T-SQL按期间和模式日期在多组中求和

时间:2014-06-05 00:50:42

标签: sql-server tsql

我需要按级别1总结'VALUE',并且需要选择每组中的前1个值(级别2到级别5),其中max(mod日期)在max(year_month)内。

编辑:前1 - > year_month的最新moddate

level1 | level2 | level3 | level4 | level5 | year_month | VALUE  | moddate
123    | 222    | 333    | 444    | 555    |  201403    | 110.00 | 2014-01-05
123    | 222    | 333    | 444    | 555    |  201403    | 100.00 | 2013-12-11
123    | 222    | 333    | 444    | 777    |  201403    |  50.00 | 2014-01-01
123    | 333    | 333    | 5555   | 777    |  201401    | 200.00 | 2014-01-01
122    | 222    | 333    | 444    | 888    |  201403    |  60.00 | 2014-01-01

结果

level1   SUM
123      360
122       60

我看了各种“群组中的顶级x”问题,但我无法让它为我工作。

我能想到的唯一“解决方案”是使用游标并循环到所有级别,但必须有更好的方法来执行此操作。

有什么建议吗?

由于

4 个答案:

答案 0 :(得分:0)

试试这个:

select level1, SUM(value) sum
from(
  select h.level1, h.VALUE
  from Huh h 
  where year(h.moddate) = h.year_month/100
  ) x
group by level1

SQL Fiddle

答案 1 :(得分:0)

根据我的理解你的要求,你要总结所有项目level1,其中moddate< = yearmonth和moddate = max(moddate)

 select level1, sum(value) as SUM
 FROM
 (
   select level1, value, year_month, moddate
   max(moddate) OVER (PARTITION BY level1 ORDER BY year_month DESC) as maxmoddate
   from table
 )
 WHERE moddate = maxmoddate and 
       (year(moddate)*100)+month(moddate) <= year_month
 group by level1

答案 2 :(得分:0)

你的解释和期望的结果有点矛盾(至少就我能解释它而言),但这应该遵循你对你想要的描述。对于level1的每个值,它将为您提供level2-level5的最大值以及在某个year_month之前可用的最新year_month的所有值的总和;

WITH cte AS (
  SELECT level1, year_month, 
  MAX(level2) level2, MAX(level3) level3, MAX(level4) level4, MAX(level5) level5, 
  SUM(value) [sum], 
  RANK() OVER (PARTITION BY level1 ORDER BY year_month DESC) rn
  FROM table1
  WHERE year_month < 201402
  GROUP BY level1, year_month
)
SELECT level1, level2, level3, level4, level5, sum FROM cte WHERE rn=1;

唯一棘手的问题是RANK() OVER()用于查找每个级别1可用的最新月份。最近一个月将得到一个rn = 1的值,然后用它来过滤外部选择中的值。

An SQLfiddle to test with

答案 3 :(得分:0)

您的描述并不完全清楚,但如果该示例应该支持它,那么我将得出以下结论:

  1. 您希望将数据集拆分为level1, level2, level3, level4, level5, year_month组。

  2. 您只想要year_month中相应超级组level1, level2, level3, level4, level5VALUE为最大值的组。

  3. 要从每个组中提取一个VALUE

  4. 提取的moddate必须与群组中的最新moddate相对应。 (我的假设是VALUE值在组内是唯一的。)

  5. 最后,您希望获得每level1 WITH partitioned AS ( SELECT *, max_year_month = MAX(year_month) OVER (PARTITION BY level1, level2, level3, level4, level5), max_moddate = MAX(moddate ) OVER (PARTITION BY level1, level2, level3, level4, level5, year_month) FROM dbo.atable ) SELECT level1, total = SUM(VALUE) FROM partitioned WHERE year_month = max_year_month AND moddate = max_moddate GROUP BY level1 ; 提取值的总和。

  6. 以下是my attempt at a solution

    MAX

    基本上,此查询使用窗口聚合函数{{1}}来查找每个组的最新行和每个相应超级组的最新组。然后,它使用这些结果来过滤数据集,其余的只是简单的分组和聚合。