我需要你的帮助,我有两张桌子的销售和购买,我的要求是如果月份相同的话,可以在同一栏中获得销售和购买的结果。我正在使用下面的代码。
<?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
答案 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')