0

両方のタイムスタンプとして日付を含む最初の収入と2番目の支出、および各月の収入と支出の合計、次のようにテーブルに入れたい

Month | Income | Expense | Profit

これまで、金額を合計として 1 つのテーブルしかグループ化できませんでしたが、両方のテーブルを同時に処理できるクエリが必要です。

私のクエリは

$result = mysql_query("SELECT 
    date_on,
    MONTHNAME(FROM_UNIXTIME(date_on)) as expmonth,
    YEAR(FROM_UNIXTIME(date_on)) as expyear,
    sum(amount) as exp_total

    from finance_grdps_exp

    group by  expmonth,expyear order by date_on DESC")

    or die(mysql_error());  
    $no=0;   
    $countem = 0;
    while($row = mysql_fetch_array($result))
        {$no++;
            echo' 
            <tr class="gradeX">
                <td>'.
                $row['expmonth'].' '.$row['expyear'].'
                </td>
                <td>'.
                $row['exp_total'].'
                </td>
                <td>'.
                $row['income_total'].' /* not working as if now
                </td>
                <td>'.
                PROFIT.'/* not working as if now
                </td>
                </tr> 
                ';
                }

Guys サンプルのデータベースは ....

収入表……

名前| 収入_日付 (タイムスタンプ) | 収入_金額

指数表

名前|日時 (タイムスタンプ) |金額

どうも

Ruben 返信ありがとうございます ....しかし、エラーが発生しています

...どちらの場合もエラーが発生します---すべての派生テーブルには独自のエイリアスが必要です....

SELECT MONTHNAME(FROM_UNIXTIME(date_on)) as expmonth,
       YEAR(FROM_UNIXTIME(date_on)) as expyear,
       SUM(amount) as exp_total, 
       SUM(income_amount) as inc_total 
FROM(SELECT finance_grdps_exp.date_on AS date_on, 
            finance_grdps_exp.amount AS exp_amount, 
            0 AS inc_amount 
     UNION 
     SELECT finance_grdps_income.income_date AS date_on, 
            0 AS exp_amount, 
            finance_grdps_income.income_amount AS inc_amount) 
GROUP BY expyear, expmonth ORDER BY date_on DESC 

助けてください

4

1 に答える 1

0

次の構造の 2 つのテーブル finance_grdps_exp と finance_grdps_inc があるとします。

日付_オン | 額
  1. 1 つのテーブルの date_on に同じ年と月がエンコードされた 2 つの行がない場合、date_on には年と月のみが含まれます。つまり、他のフィールド (日と時刻) はすべての行で同じです。

    それらを INNER JOIN 構造と組み合わせることができます。

    SELECT finance_grdps_exp.date_on AS date_on,
           finance_grdps_exp.amount AS exp_amount,
           finance_grdps_inc.amount AS inc_amount
    FROM finance_grdps_exp INNER JOIN finance_grdps_inc
    ON finance_grdps_exp.date_on = finance_grdps_inc.date_on
    

    結果の構造は次のとおりです。

    日付_オン | exp_amount | inc_amount

    次に、結果の構造にアイデアを適用しましょう。

    SELECT date_on,
           MONTHNAME(FROM_UNIXTIME(finance_grdps_exp_and_inc.date_on)) as expmonth,
           YEAR(FROM_UNIXTIME(finance_grdps_exp_and_inc.date_on)) as expyear,
           SUM(finance_grdps_exp_and_inc.exp_amount) as exp_total,
           SUM(finance_grdps_exp_and_inc.inc_amount) as inc_total
    
    FROM (SELECT finance_grdps_exp.date_on AS date_on,
                 finance_grdps_exp.amount AS exp_amount,
                 finance_grdps_inc.amount AS inc_amount
    FROM finance_grdps_exp INNER JOIN finance_grdps_inc
    ON finance_grdps_exp.date_on = finance_grdps_inc.date_on) AS finance_grdps_exp_and_inc
    
    GROUP BY expyear, expmonth ORDER BY date_on DESC
    

    mysql_query は以下を提供します。

        [
          expmonth,
          expyear,
          exp_total /* expense per month */,
          inc_total /* income per month */
        ]
    

    INNER JOIN ステートメントの最大のパフォーマンスを確保するには、両方のテーブルに date_on フィールドのインデックスを作成します。

  2. その他の場合 (UNION SELECT を使用)。

    SELECT MONTHNAME(FROM_UNIXTIME(finance_grdps_exp_and_inc.date_on)) as expmonth,
           YEAR(FROM_UNIXTIME(finance_grdps_exp_and_inc.date_on)) as expyear,
           SUM(finance_grdps_exp_and_inc.exp_amount) as exp_total,
           SUM(finance_grdps_exp_and_inc.inc_amount) as inc_total
    FROM(SELECT finance_grdps_exp.date_on AS date_on,
           finance_grdps_exp.amount AS exp_amount,
           0 AS inc_amount 
           FROM finance_grdps_exp
         UNION 
         SELECT finance_grdps_inc.date_on AS date_on,
           0 AS exp_amount,
           finance_grdps_inc.amount AS inc_amount
           finance_grdps_inc) AS finance_grdps_exp_and_inc
    GROUP BY expyear, expmonth ORDER BY date_on DESC
    
于 2012-05-09T15:01:53.273 に答える