0

mysql にテーブルがあり、日付、収益の列があり、現在の月の各日に生成された収益が、「この日付までの収益の合計」という形式の日付に変換する必要があります。

私はそれを行うことができます

select max(date) as date, sum(revenue) as total_revenue_to_date from table where dayofmonth(date)<=1
union
select max(date) as date, sum(revenue) as total_revenue_to_date from table where dayofmonth(date)<=2
.......

などですが、より良い形式で書きたいと思います。

誰にもアイデアはありますか?

回答: 最短で、最も簡単に理解できる:

SELECT fulldate, 
(SELECT SUM(margin) FROM fact_agg_margin_live_daily d2 WHERE d1.fulldate>=d2.fulldate) AS margin 
FROM fact_agg_margin_live_daily d1
4

2 に答える 2

2

私はいくつかのテストを行ったので、ここに私の例があります:

テーブル名 = materiales フィールド名 = id_material

行: 1、2、3、4、6、7、9 (列 id_material)

使用したクエリ:

SELECT id_material, (SELECT SUM(id_material) FROM materiales M2 WHERE M1.id_material>=M2.id_material) AS スマ FROM materiales M1

期待される結果: 現在の ID を持つ column1、現在の ID と前の ID の結果の合計を持つ column2、そしてそうです、それは機能します。

次のように、現在のシナリオに変更できます。

SELECT date, (SELECT SUM(revenue) FROM table T2 WHERE T1.date >= T2.date) AS Revenue_until_current_date FROM テーブル T1

これにより、各日付とその日付までの収益が返されます。行が毎日保存されている場合、その日の収益と前の収益を合わせて毎日返されます。

于 2013-06-04T14:09:21.063 に答える
1

group byクエリに使用する方がはるかに簡単です。

select max(date) as date, sum(revenue) as total_revenue_to_date
from table
group by dayofmonth(date)

累積合計が必要です(クエリでは実行されません)。以下に 1 つの方法を示します (1 か月が 30 日の場合)。

select max(date) as date, sum(revenue) as total_revenue_to_date
from t join
     (select 0 as n union all select 1 union all select 2 union all select 3 union all select 4 union all
      select 5 as n union all select 6 union all select 7 union all select 8 union all select 9 union all
      select 10 as n union all select 11 union all select 12 union all select 13 union all select 14 union all
      select 15 as n union all select 16 union all select 17 union all select 18 union all select 19 union all
      select 20 as n union all select 21 union all select 22 union all select 23 union all select 24 union all
      select 25 as n union all select 26 union all select 27 union all select 28 union all select 29 union all
      select 30
     ) n
     on day(date) + n <= 30
group by day(date) + n;

変数を使用してこれを行うこともできます。

  select max(date) as date, sum(revenue) as total_revenue_to_date,
         @sum := @sum + SUM(revenue) as cumsum
  from table cross join
       (select @sum := 0) const
  group by dayofmonth(date)
于 2013-06-04T13:28:49.220 に答える