0

毎月、四半期ごと、半年ごと、年ごとに購入できるさまざまなパッケージのサービスがあります。

各パッケージには due_on の日付があり、誰かが更新するたびにインクリメントします。

今月の期日が誰であるかを確認することで、今月の収益の概算を簡単に計算できます。

私が困っているのは、翌年に毎月どれだけの収益を期待できるかを計算することです。due_on に基づいて計算することはできません。翌年に 12 回支払う人もいれば、6 回支払う人もいるからです。

これを行う最善の方法は何ですか?注:この目的のために、私は消耗を無視しています. 私はPHPとMySQLで働いていますが、理論を求めているので、それはあまり重要ではありません.

4

1 に答える 1

1

次の12か月の月間収益を計算する場合を考えてみましょう。

私はそれを行うための2つの基本的な方法を見ることができます:

  1. 次の12か月ごとに、バケットの配列(またはハッシュ)を作成します。次に、アクティブなサブスクリプションごとに繰り返し、サブスクリプションごとに、そこから期待される収益をすべての適切なバケットに追加します。たとえば、条件が毎月の場合、その支払いをすべてのバケットに追加します。期間が四半期ごとの場合は、その支払いを現在のdue_date月のバケットに追加し、その後3、6、および9か月のバケットに追加します。など。これはコーディングがかなり簡単ですが、十分な数の顧客がレポートを生成すると、時間がかかる場合があります。

  2. monthmysqlデータベースに( 、 )の列を持つ一時テーブルを作成amountし、一連の挿入ステートメントを入力して(たくさんあります。すぐにそれらに到達します)、そのテーブルに対してレポートを作成します。

    これはもう少し珍しいので、詳しく説明します。私はあなたのSQLテーブル構造についていくつかの仮定をしていますが、可能な限り一般的なものにしようとしています。

    due_onしたがって、最初に一時テーブルが必要です。最初に、現在の日付に基づいて月ごとの収益を入力します。

    CREATE TEMPORARY TABLE FutureRevenueReport
    SELECT
      CONCAT(YEAR(s.due_on), '-', MONTH(s.due_on)) as revenue_month,
      s.due_amount as revenue_amount
    FROM subscriptions s WHERE s.active = 'True';
    

    同じmysqlセッションで、次の一連の挿入ステートメントを実行して、将来の収益を入力します。

    INSERT INTO FutureRevenueReport(revenue_month, revenue_amount)
    SELECT CONCAT(YEAR(s.due_on + INTERVAL 1 MONTH), '-', 
                  MONTH(s.due_on + INTERVAL 1 MONTH)), s.due_amount
    FROM subscriptions s WHERE s.active = 'True' AND s.term = 'MONTHLY';
    
    INSERT INTO FutureRevenueReport(revenue_month, revenue_amount)
    SELECT CONCAT(YEAR(s.due_on + INTERVAL 2 MONTH), '-', 
                  MONTH(s.due_on + INTERVAL 2 MONTH)), s.due_amount
    FROM subscriptions s WHERE s.active = 'True' AND s.term = 'MONTHLY';
    
    INSERT INTO FutureRevenueReport(revenue_month, revenue_amount)
    SELECT CONCAT(YEAR(s.due_on + INTERVAL 3 MONTH), '-', 
                  MONTH(s.due_on + INTERVAL 3 MONTH)), s.due_amount
    FROM subscriptions s WHERE s.active = 'True' AND s.term = 'MONTHLY';
    -- etc, up to + INTERVAL 11 MONTH
    
    -- Now the quarterly:
    INSERT INTO FutureRevenueReport(revenue_month, revenue_amount)
    SELECT CONCAT(YEAR(s.due_on + INTERVAL 3 MONTH), '-', 
                  MONTH(s.due_on + INTERVAL 3 MONTH)), s.due_amount
    FROM subscriptions s WHERE s.active = 'True' AND s.term = 'QUARTERLY';
    
    INSERT INTO FutureRevenueReport(revenue_month, revenue_amount)
    SELECT CONCAT(YEAR(s.due_on + INTERVAL 6 MONTH), '-', 
                  MONTH(s.due_on + INTERVAL 6 MONTH)), s.due_amount
    FROM subscriptions s WHERE s.active = 'True' AND s.term = 'QUARTERLY';
    -- And the same for 9 months
    -- Then do the same thing for SEMI-ANNUALLY and + INTERVAL 6 MONTH
    
    -- And now the report:
    SELECT revenue_month, sum(revenue_amount) as revenue from FutureRevenueReport
    GROUP BY revenue_month;
    
于 2011-05-05T12:04:12.867 に答える