Mysql 需要显示过去6个月复杂子查询的成本
我知道如何在单个查询中获得过去6个月的数据,但我有一个查询,可以从多个子查询中获得数据,我只需要显示过去6个月的数据 这是我目前的问题Mysql 需要显示过去6个月复杂子查询的成本,mysql,select,Mysql,Select,我知道如何在单个查询中获得过去6个月的数据,但我有一个查询,可以从多个子查询中获得数据,我只需要显示过去6个月的数据 这是我目前的问题 SELECT `totalSales`,`totalPurchase`,`totalNetpay`,`totalPension`,`totalP32` FROM (SELECT SUM((`Unit_Cost`*`ExchangeRate`)*`Quantity`) AS `totalSales` FROM `salesinvoice_products` AS
SELECT `totalSales`,`totalPurchase`,`totalNetpay`,`totalPension`,`totalP32`
FROM
(SELECT SUM((`Unit_Cost`*`ExchangeRate`)*`Quantity`) AS `totalSales` FROM `salesinvoice_products` AS `prod`
LEFT JOIN `salesinvoice` AS `inv` on `prod`.`SalesInvoice_id`=`inv`.`SalesInvoice_id`) as `t1`,
(SELECT SUM((`InvoiceValue`*`ExchangeRate`)-`VATValue`) as `totalPurchase` FROM `purchaseinvoice`) as `t2`,
(SELECT SUM(`NetAmountPaid`) as `totalNetpay` FROM `payroll_netpay`) as `t3`,
(SELECT SUM(`totalAmountDue`) as `totalPension` FROM `payroll_pensionrecords`) as `t4`,
(SELECT SUM(`totalAmountDue`) as `totalP32` FROM `payroll_p32records`) as `t5`
如您所见,我有5个子查询。现在这个给了我输出
3122.0517192173.91120010019.007351.562231.43
然而,我想要的是从过去6个月里得到6条线路。然而,当我尝试这样做时,我得到了多行而不是6行。我想我必须以某种方式将他们分组
好的,现在我将向您展示我试图使其工作的代码
SELECT `InvoiceDate`,`totalSales`,`totalPurchase`,`totalNetpay`,`totalPension`,`totalP32`
FROM
(SELECT SUM((`Unit_Cost`*`ExchangeRate`)*`Quantity`) AS `totalSales`,`InvoiceDate` FROM `salesinvoice_products` AS `prod`
LEFT JOIN `salesinvoice` AS `inv` on `prod`.`SalesInvoice_id`=`inv`.`SalesInvoice_id`
WHERE (`InvoiceDate` < Now() and `InvoiceDate` > DATE_ADD(Now(), INTERVAL- 6 MONTH)) && `InvoiceType`>1
GROUP BY MONTH(`InvoiceDate`)
) as `t1`,
(SELECT SUM((`InvoiceValue`*`ExchangeRate`)-`VATValue`) as `totalPurchase` FROM `purchaseinvoice`
WHERE (`InvoiceDate` < Now() and `InvoiceDate` > DATE_ADD(Now(), INTERVAL- 6 MONTH))
GROUP BY MONTH(`InvoiceDate`)
) as `t2`,
(SELECT SUM(`NetAmountPaid`) as `totalNetpay` FROM `payroll_netpay`
WHERE (`Date` < Now() and `Date` > DATE_ADD(Now(), INTERVAL- 6 MONTH))
GROUP BY MONTH(`Date`)
) as `t3`,
(SELECT SUM(`totalAmountDue`) as `totalPension` FROM `payroll_pensionrecords`
WHERE (`datePaid` < Now() and `datePaid` > DATE_ADD(Now(), INTERVAL- 6 MONTH))
GROUP BY MONTH(`datePaid`)
) as `t4`,
(SELECT SUM(`totalAmountDue`) as `totalP32` FROM `payroll_p32records`
WHERE (`datePaid` < Now() and `datePaid` > DATE_ADD(Now(), INTERVAL- 6 MONTH))
GROUP BY MONTH(`datePaid`)
) as `t5`
这给了我一个月的数据,但对我最初的查询没有太大帮助,但我尝试了其他一些方法。是的,我有一个有效的答案,但无论如何它都不是最好的解决方案。我真的很想用一个查询来回答我的问题,但我提出的唯一解决方案是使用php并循环mysql。是的,我知道这并不理想,但我需要尽快找到一个解决方案,尽管这不是最好的方法,但它确实有效。我会继续下去,看看我是否能找到一种只使用mysql就可以做到这一点的方法,但目前必须这样做 基本上我的查询是一次一个月。因此,我必须在php中增加月份,并重新运行所有6个月的查询 现在正在寻找更好的解决方案
$plArray = array();
for ($i = 0; $i <= 5; $i++):
$month = date("m", strtotime( date( 'Y-m-01' )." -$i months"));
$query="SELECT IFNULL(`totalSales`,0)-IFNULL(`totalPurchase`,0)-(IFNULL(`totalNetpay`,0)+IFNULL(`totalP32`,0)+IFNULL(`totalPension`,0)) as `totalPL`";
$query.="
FROM (SELECT SUM((`Unit_Cost`*`ExchangeRate`)*`Quantity`) AS `totalSales` FROM `salesinvoice_products` AS `prod`
LEFT JOIN `salesinvoice` AS `inv` on `prod`.`SalesInvoice_id`=`inv`.`SalesInvoice_id`
WHERE MONTH(`InvoiceDate`)=?
) as `t1`,
(SELECT SUM((`InvoiceValue`*`ExchangeRate`)-`VATValue`) as `totalPurchase` FROM `purchaseinvoice`
WHERE MONTH(`InvoiceDate`)=?
) as `t2`,
(SELECT SUM(`NetAmountPaid`) as `totalNetpay` FROM `payroll_netpay`
WHERE MONTH(`Date`)=?
) as `t3`,
(SELECT SUM(`totalAmountDue`) as `totalPension` FROM `payroll_pensionrecords`
WHERE MONTH(`datePaid`)=?
) as `t4`,
(SELECT SUM(`totalAmountDue`) as `totalP32` FROM `payroll_p32records`
WHERE MONTH(`datePaid`)=?
) as `t5`";
$stmt = $this->logon->db->prepare($query);
$stmt->bind_param('iiiii',$month,$month,$month,$month,$month);
$stmt->execute();
$result = $this->functions->get_result($stmt);
$plArray[] = array(
'date' => date("Y-m", strtotime( date( 'Y-m-01' )." -$i months")),
'total' => $result[0]['totalPL']
);
endfor;
$plArray=array();
对于($i=0;$i登录->数据库->准备($query);
$stmt->bind_参数('iiii',$month,$month,$month,$month,$month,$month);
$stmt->execute();
$result=$this->functions->get\u result($stmt);
$plArray[]=数组(
“日期”=>日期(“Y-m”,标准时间(日期(“Y-m-01”)。“-$i个月”),
'total'=>$result[0]['totalPL']
);
endfor;
荒谬。请看:很好,我已经阅读了整个页面,但在该页面上没有一次提到MCVE的含义,这是真正没有帮助的。至于显示create和insert,我在dbforge中构建数据库时没有使用它们,我已经用我的第二段代码展示了我迄今为止所做的最大努力。至于这些关系,它们不会产生任何差异上面代码中的引用。我上面的代码中应该有足够的信息来提供解决方案。最终可能会自己解决。也许你还没有真正阅读整页。@ThomasWilliams草莓创建并链接到这个问题的整个指南都是关于MCVE的。因为你的查询在语法上是正确的,所以只需do不返回预期的结果集,因此您应该提供一些示例数据,并解释您正在尝试实现的内容。以当前的形式,我不知道您在追求什么,从关闭和关闭投票来看,我不是唯一一个遇到此问题的人。您可以任意抨击草莓,但这不会让您走得更远ting回答。我想这很清楚我在追求什么。第一个查询给出了总数,但我想要过去6个月的总数。第二个mysql代码显示了我尝试过的内容,但显然不起作用。所有字段都在那里,任何人都可以看到。至于MCVE,我甚至不知道缩写词是什么。我已经阅读了那一整页它一次也没有告诉我它是什么。
$plArray = array();
for ($i = 0; $i <= 5; $i++):
$month = date("m", strtotime( date( 'Y-m-01' )." -$i months"));
$query="SELECT IFNULL(`totalSales`,0)-IFNULL(`totalPurchase`,0)-(IFNULL(`totalNetpay`,0)+IFNULL(`totalP32`,0)+IFNULL(`totalPension`,0)) as `totalPL`";
$query.="
FROM (SELECT SUM((`Unit_Cost`*`ExchangeRate`)*`Quantity`) AS `totalSales` FROM `salesinvoice_products` AS `prod`
LEFT JOIN `salesinvoice` AS `inv` on `prod`.`SalesInvoice_id`=`inv`.`SalesInvoice_id`
WHERE MONTH(`InvoiceDate`)=?
) as `t1`,
(SELECT SUM((`InvoiceValue`*`ExchangeRate`)-`VATValue`) as `totalPurchase` FROM `purchaseinvoice`
WHERE MONTH(`InvoiceDate`)=?
) as `t2`,
(SELECT SUM(`NetAmountPaid`) as `totalNetpay` FROM `payroll_netpay`
WHERE MONTH(`Date`)=?
) as `t3`,
(SELECT SUM(`totalAmountDue`) as `totalPension` FROM `payroll_pensionrecords`
WHERE MONTH(`datePaid`)=?
) as `t4`,
(SELECT SUM(`totalAmountDue`) as `totalP32` FROM `payroll_p32records`
WHERE MONTH(`datePaid`)=?
) as `t5`";
$stmt = $this->logon->db->prepare($query);
$stmt->bind_param('iiiii',$month,$month,$month,$month,$month);
$stmt->execute();
$result = $this->functions->get_result($stmt);
$plArray[] = array(
'date' => date("Y-m", strtotime( date( 'Y-m-01' )." -$i months")),
'total' => $result[0]['totalPL']
);
endfor;