0

これを解決する方法についてのアイデアはありますか?

これは私が持っているDBの例です:profile_table

user_id    status   points   created_at 
01          1        20       2011-01-01 01:03:35
02          1        50       2011-01-02 01:03:35
03          1        800      2011-01-04 01:03:35
04          1        152      2011-02-15 01:03:35
05          1        388      2011-02-20 01:03:35
06          0        40       2011-02-25 01:03:35
07          1        246      2011-02-26 01:03:35
08          1        335      2011-02-27 01:03:35
09          1        521      2011-03-08 01:03:35
10          1        5354     2011-03-14 01:03:35
11          0        22       2011-03-18 01:03:35
12          1        234      2011-04-03 01:03:35
13          1        222      2011-04-05 01:03:35
14          1        396      2011-04-24 01:03:35

2番目のテーブル:spend_points

price_id    spend_points   created_at
1           20             2011-01-01 01:03:35
2           10             2011-01-02 01:03:35
3           30             2011-01-05 01:03:35
8           40             2011-01-06 01:03:35
14          10             2011-02-03 01:03:35
7           50             2011-02-06 01:03:35
14          10             2011-02-07 01:03:35
2           10             2011-03-03 01:03:35
14          60             2011-03-12 01:03:35
14          10             2011-04-07 01:03:35
2           70             2011-04-12 01:03:35
14          80             2011-04-15 01:03:35
14          20             2011-04-21 01:03:35

最初のテーブルはグループに属しており、このグループは'price_id' = 14のアイテムにのみポイントを使うことができます。spend_pointsテーブルにはすべてのアイテムが使われ、14個あります。私が作成しようとしているクエリには、price_id = 14に費やすことができるすべてのユーザーからのデータが表示されます。テーブルには、ポイントの合計、支出ポイントの合計、およびこれまでのすべてのポイントが含まれている必要があります。そのデータだけが必要な場合は簡単に聞こえますが、私にとっての問題は、これの履歴を作成しようとするときです。新しい月ごとに、前の月と前の月の更新などが表示されます。

ステータス=0は、非アクティブであり、

したがって、ファイナルテーブルは次のようになります。

Detail                    January   February  March  April 
Total Active Users        3         7         9      12
Total Inactive Users      0         1         2      2
Total Point               807       2031      7928   8780      
Spend Points              0         20        80     190
Points So Far             807       2051      8008   8970

どうやってやるのか分かりますか?:'(

4

2 に答える 2

1

長いですが、1年ベースで実行されます...データが数年にわたる場合は、各select/unionに該当する「year」where句を追加するだけです。クエリの前提は、毎月事前に事前に宣言することです。これにより、特定の月の集計の「締め切り」日がどこにあるかがわかります(つまり、1月は2月未満の合計、2月は3月までの合計です。 、など)。それぞれが月ごとに独自のピボットロールアップを必要とします。これがこれを長くする理由ですが、結果を得るために従うのは非常に簡単です。特に大規模なセットで、このようなクエリをどのように計画するかではありません。予想される集計の月/年あたりの「ロールアップ」値を含む単一のテーブルが必要であり、該当する場合はトリガーがあります。必要に応じて、カウントやポイントを更新するだけです。

set @jan := date( "2011-01-01" );
set @feb := date( "2011-02-01" );
set @mar := date( "2011-03-01" );
set @apr := date( "2011-04-01" );
set @may := date( "2011-05-01" );
set @jun := date( "2011-06-01" );
set @jul := date( "2011-07-01" );
set @aug := date( "2011-08-01" );
set @sep := date( "2011-09-01" );
set @oct := date( "2011-10-01" );
set @nov := date( "2011-11-01" );
set @decem := date( "2011-12-01" );
set @nextYr := date( "2012-01-01" );


select 
      'Active Users' as Detail,
      sum( if( pt.status = 1 and pt.created_at < @feb, 1, 0 )) January,
      sum( if( pt.status = 1 and pt.created_at < @mar, 1, 0 )) February,
      sum( if( pt.status = 1 and pt.created_at < @apr, 1, 0 )) March,
      sum( if( pt.status = 1 and pt.created_at < @may, 1, 0 )) April,
      sum( if( pt.status = 1 and pt.created_at < @jun, 1, 0 )) May,
      sum( if( pt.status = 1 and pt.created_at < @jul, 1, 0 )) June,
      sum( if( pt.status = 1 and pt.created_at < @aug, 1, 0 )) July,
      sum( if( pt.status = 1 and pt.created_at < @sep, 1, 0 )) August,
      sum( if( pt.status = 1 and pt.created_at < @oct, 1, 0 )) September,
      sum( if( pt.status = 1 and pt.created_at < @nov, 1, 0 )) October,
      sum( if( pt.status = 1 and pt.created_at < @decem, 1, 0 )) November,
      sum( if( pt.status = 1 and pt.created_at < @nextYr, 1, 0 )) December
   from
      profile_table pt
union
select 
      'Inactive Users' as Detail,
      sum( if( pt.status = 0 and pt.created_at < @feb, 1, 0 )) January,
      sum( if( pt.status = 0 and pt.created_at < @mar, 1, 0 )) February,
      sum( if( pt.status = 0 and pt.created_at < @apr, 1, 0 )) March,
      sum( if( pt.status = 0 and pt.created_at < @may, 1, 0 )) April,
      sum( if( pt.status = 0 and pt.created_at < @jun, 1, 0 )) May,
      sum( if( pt.status = 0 and pt.created_at < @jul, 1, 0 )) June,
      sum( if( pt.status = 0 and pt.created_at < @aug, 1, 0 )) July,
      sum( if( pt.status = 0 and pt.created_at < @sep, 1, 0 )) August,
      sum( if( pt.status = 0 and pt.created_at < @oct, 1, 0 )) September,
      sum( if( pt.status = 0 and pt.created_at < @nov, 1, 0 )) October,
      sum( if( pt.status = 0 and pt.created_at < @decem, 1, 0 )) November,
      sum( if( pt.status = 0 and pt.created_at < @nextYr, 1, 0 )) December
   from
      profile_table pt
union
select 
      'Total Points' as Detail,
      sum( pt.points * if( pt.status = 1 and pt.created_at < @feb, 1, 0 )) January,
      sum( pt.points * if( pt.status = 1 and pt.created_at < @mar, 1, 0 )) February,
      sum( pt.points * if( pt.status = 1 and pt.created_at < @apr, 1, 0 )) March,
      sum( pt.points * if( pt.status = 1 and pt.created_at < @may, 1, 0 )) April,
      sum( pt.points * if( pt.status = 1 and pt.created_at < @jun, 1, 0 )) May,
      sum( pt.points * if( pt.status = 1 and pt.created_at < @jul, 1, 0 )) June,
      sum( pt.points * if( pt.status = 1 and pt.created_at < @aug, 1, 0 )) July,
      sum( pt.points * if( pt.status = 1 and pt.created_at < @sep, 1, 0 )) August,
      sum( pt.points * if( pt.status = 1 and pt.created_at < @oct, 1, 0 )) September,
      sum( pt.points * if( pt.status = 1 and pt.created_at < @nov, 1, 0 )) October,
      sum( pt.points * if( pt.status = 1 and pt.created_at < @decem, 1, 0 )) November,
      sum( pt.points * if( pt.status = 1 and pt.created_at < @nextYr, 1, 0 )) December
   from
      profile_table pt
union
select 
      'Spend Points' as Detail,
      sum( sp.spend_points * if( sp.price_id = 14 and sp.created_at < @feb, 1, 0 )) January,
      sum( sp.spend_points * if( sp.price_id = 14 and sp.created_at < @mar, 1, 0 )) February,
      sum( sp.spend_points * if( sp.price_id = 14 and sp.created_at < @apr, 1, 0 )) March,
      sum( sp.spend_points * if( sp.price_id = 14 and sp.created_at < @may, 1, 0 )) April,
      sum( sp.spend_points * if( sp.price_id = 14 and sp.created_at < @jun, 1, 0 )) May,
      sum( sp.spend_points * if( sp.price_id = 14 and sp.created_at < @jul, 1, 0 )) June,
      sum( sp.spend_points * if( sp.price_id = 14 and sp.created_at < @aug, 1, 0 )) July,
      sum( sp.spend_points * if( sp.price_id = 14 and sp.created_at < @sep, 1, 0 )) August,
      sum( sp.spend_points * if( sp.price_id = 14 and sp.created_at < @oct, 1, 0 )) September,
      sum( sp.spend_points * if( sp.price_id = 14 and sp.created_at < @nov, 1, 0 )) October,
      sum( sp.spend_points * if( sp.price_id = 14 and sp.created_at < @decem, 1, 0 )) November,
      sum( sp.spend_points * if( sp.price_id = 14 and sp.created_at < @nextYr, 1, 0 )) December
   from
      spend_points sp
union
select 
      'Points So Far' as Detail,
      PointsPerMonth.January + SpendPerMonth.January January,
      PointsPerMonth.February + SpendPerMonth.February February,
      PointsPerMonth.March + SpendPerMonth.March March,
      PointsPerMonth.April + SpendPerMonth.April April,
      PointsPerMonth.May + SpendPerMonth.May May,
      PointsPerMonth.June + SpendPerMonth.June June,
      PointsPerMonth.July + SpendPerMonth.July July,
      PointsPerMonth.August + SpendPerMonth.August August,
      PointsPerMonth.September + SpendPerMonth.September September,
      PointsPerMonth.October + SpendPerMonth.October October,
      PointsPerMonth.November + SpendPerMonth.November November,
      PointsPerMonth.December + SpendPerMonth.December December 
   from
      ( select 
              sum( pt.points * if( pt.status = 1 and pt.created_at < @feb, 1, 0 )) January,
              sum( pt.points * if( pt.status = 1 and pt.created_at < @mar, 1, 0 )) February,
              sum( pt.points * if( pt.status = 1 and pt.created_at < @apr, 1, 0 )) March,
              sum( pt.points * if( pt.status = 1 and pt.created_at < @may, 1, 0 )) April,
              sum( pt.points * if( pt.status = 1 and pt.created_at < @jun, 1, 0 )) May,
              sum( pt.points * if( pt.status = 1 and pt.created_at < @jul, 1, 0 )) June,
              sum( pt.points * if( pt.status = 1 and pt.created_at < @aug, 1, 0 )) July,
              sum( pt.points * if( pt.status = 1 and pt.created_at < @sep, 1, 0 )) August,
              sum( pt.points * if( pt.status = 1 and pt.created_at < @oct, 1, 0 )) September,
              sum( pt.points * if( pt.status = 1 and pt.created_at < @nov, 1, 0 )) October,
              sum( pt.points * if( pt.status = 1 and pt.created_at < @decem, 1, 0 )) November,
              sum( pt.points * if( pt.status = 1 and pt.created_at < @nextYr, 1, 0 )) December
           from
              profile_table pt ) PointsPerMonth,
      ( select
              sum( sp.spend_points * if( sp.price_id = 14 and sp.created_at < @feb, 1, 0 )) January,
              sum( sp.spend_points * if( sp.price_id = 14 and sp.created_at < @mar, 1, 0 )) February,
              sum( sp.spend_points * if( sp.price_id = 14 and sp.created_at < @apr, 1, 0 )) March,
              sum( sp.spend_points * if( sp.price_id = 14 and sp.created_at < @may, 1, 0 )) April,
              sum( sp.spend_points * if( sp.price_id = 14 and sp.created_at < @jun, 1, 0 )) May,
              sum( sp.spend_points * if( sp.price_id = 14 and sp.created_at < @jul, 1, 0 )) June,
              sum( sp.spend_points * if( sp.price_id = 14 and sp.created_at < @aug, 1, 0 )) July,
              sum( sp.spend_points * if( sp.price_id = 14 and sp.created_at < @sep, 1, 0 )) August,
              sum( sp.spend_points * if( sp.price_id = 14 and sp.created_at < @oct, 1, 0 )) September,
              sum( sp.spend_points * if( sp.price_id = 14 and sp.created_at < @nov, 1, 0 )) October,
              sum( sp.spend_points * if( sp.price_id = 14 and sp.created_at < @decem, 1, 0 )) November,
              sum( sp.spend_points * if( sp.price_id = 14 and sp.created_at < @nextYr, 1, 0 )) December
           from
              spend_points sp ) SpendPerMonth
于 2012-07-14T03:05:16.337 に答える
-1

スプレッドシートの世界では、人々はあなたが作りたいものを「ピボットテーブル」と呼んでいます。巨大な醜いクエリを手作業で作成しなければ、MySQLからそれを引き出すことはできません。これは、RDBMSの目的に適合しません。月ごとの値を取得し、アプリケーションレベルでレポートを作成する必要があります。同様に、これらの現在の合計は手動で処理するのが最適です。

于 2012-07-14T00:00:26.683 に答える