Php如何在同一列中获取UNION结果

时间:2017-05-17 13:49:28

标签: php mysql sum

我需要你的帮助,我有两张桌子的销售和购买,我的要求是如果月份相同的话,可以在同一栏中获得销售和购买的结果。我正在使用下面的代码。

<?php
$stmt = $db->prepare("SELECT SUM(amount) as amount,
    DATE_FORMAT(saledate,'%M %Y') as saledate,
    null as recovery 
    FROM `advertisercv` GROUP BY DATE_FORMAT(saledate, '%M %Y')
UNION all
SELECT null,
    DATE_FORMAT(date,'%M %Y') as date,
    SUM(amount) 
    FROM `paymentsrec` 
    GROUP BY DATE_FORMAT(date, '%M %Y')");
?>

结果:

S.No    Month      Sale     Recovery
1   April-2016     10000    
2   April-2016              4000    
2   January-2017    5000    
3   January-2017            3000

预期结果是:

S.No    Month      Sale     Recovery
1   April-2016     10000    4000    
2   January-2017    5000    3000

1 个答案:

答案 0 :(得分:0)

通过使用左连接,您可以匹配两个表中的行。我建议使用左连接,因为第一个表中的行可能在第二个表中没有匹配的行。下面的查询将显示advertisecv中的所有行,其中包含在paymentsrec中匹配行的总数。 if函数用零替换缺失的行数据,以便sum函数正常工作。

我还添加了一个列,作为在不同表中的列之间使用连接时可以执行的操作的示例。

SELECT 
    DATE_FORMAT(a.`saledate`,'%M %Y') as `saledate`,
    SUM(a.`amount`) as `Sale`,
    SUM(IF(b.`amount` IS NULL,0,b.`amount`)) as `Recovery`
    SUM(a.`amount`) - SUM(IF(b.`amount` IS NULL,0,b.`amount`)) as `Balance Outstanding`
FROM `advertisercv` a
LEFT JOIN `paymentsrec` b
ON DATE_FORMAT(a.`saledate`,'%M %Y) = DATE_FORMAT(b.`saledate`,'%M %Y')
GROUP BY DATE_FORMAT(a.`saledate`,'%Y %m')
ORDER BY DATE_FORMAT(a.`saledate`,'%Y %m')