第二组具有共同的时间戳和每月的总金额

时间:2012-05-09 07:06:33

标签: php sql

第一笔收入和第二笔费用,其中包括每个月的收入和费用的时间戳和时间戳, 现在我想把它放在一张表中,如下所示

Month | Income | Expense | Profit

到目前为止,我只能将一个表的数量组合为总计,但我需要一个可以同时处理这两个表的查询。

我的查询是

$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 Sample日期基础是....

收入表......

名称| Income_date(时间戳)| income_amount

Exp Table

姓名| date_on(时间戳)|金额

Thx

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 

请帮助

1 个答案:

答案 0 :(得分:0)

假设您有两个表finance_grdps_exp和finance_grdps_inc具有以下结构:

date_on | amount
  1. 如果在一个表中没有在date_on中编码的具有相同年份和月份的两行,则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
    

    结果结构是:

    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