首页 > 解决方案 > mysql datatable.net 总计行值无法正常工作

问题描述

使用 Mysql,我需要计算给定行上的总值,我尝试这样做失败了,结果异常,一行工作,其他行没有显示总数据。此电话参考了 scaisEdge 之前接听的电话,谢谢。

mysql如何在一行上显示每个投资组合、股票的值

我在输出中得到了值,但只是一行,所以它的行为不像我预期的那样。

$rows = $wpdb->get_results("
select  
t.Symbol AS Symbol
, t.Portfolio AS Portfolio
  , max(Janx) AS Janx
  , max(Febx) AS Febx
  , max(Marx) AS Marx
... etc.
  , max(Decx) AS Decx
  , (
    max(Janx) 
  + max(Febx) 
  + max(Decx) 
    ) AS Total
from  (
  SELECT
  s.symbol AS Symbol,
  p.code AS Portfolio,
  (case when ANY_VALUE(DATE_FORMAT(d.pdate,'%b')) = 'Jan' then 
 IFNULL(CEILING((SUM(IF(t.transaction_type='Buy',t.quantity,t.quantity 
    * -1)) * ANY_VALUE(d.dividend) ) / 100),0) end) AS Janx,
      (case when ANY_VALUE(DATE_FORMAT(d.pdate,'%b')) = 'Feb' then 

 IFNULL(CEILING((SUM(IF(t.transaction_type='Buy',t.quantity,t.quantity * 
-1)) * ANY_VALUE(d.dividend) ) / 100),0) end) AS Febx,
  (case when ANY_VALUE(DATE_FORMAT(d.pdate,'%b')) = 'Mar' then 
 IFNULL(CEILING((SUM(IF(t.transaction_type='Buy',t.quantity,t.quantity * -1)) * ANY_VALUE(d.dividend) ) / 100),0) end) AS Marx,
... etc 
(case when ANY_VALUE(DATE_FORMAT(d.pdate,'%b')) = 'Dec' then
IFNULL(CEILING((SUM(IF(t.transaction_type='Buy',t.quantity,t.quantity * -1)) * ANY_VALUE(d.dividend) ) / 100),0) end) AS Decx

  FROM dm_transactions t
  INNER JOIN dm_dividends d ON (d.stock_id = t.stock_id)
  INNER JOIN dm_stocks s ON (s.id = t.stock_id) 
  INNER JOIN dm_portfolios p ON (t.portfolio_id = p.id)
  WHERE ANY_VALUE(d.pdate) >= CURDATE()
  AND 
  t.user_id >= IF($user_id=4,2,$user_id)
  AND
  t.user_id <= IF($user_id=4,3,$user_id)
  GROUP BY    s.symbol,d.pdate
) t
GROUP BY   t.Symbol, t.Portfolio
... etc.

foreach ($rows as $row ){
echo "<tr>";
echo "<td>$row->Portfolio</td>";
echo "<td>$row->Symbol</td>";
echo "<td>$row->Janx</td>";
... etc.
echo "<td>$row->Decx</td>";
echo "<td>$row->Total</td>";

总值未正确汇总,有些行没有显示总值,当有数据时,我怀疑我的 SQL 查询一定不正确。我的报告的所有其他方面都在发挥作用。

希望是我的一个简单错误。

提前谢谢了

科林

标签: phpmysqlwordpress

解决方案


我的 IFNULL 表达式没有正确定位在 MySQL 语句中,修改后的 IFNULL 语句如下所示

  SELECT
  ANY_VALUE(s.symbol) AS Symbol,
  ANY_VALUE(p.code) AS Portfolio,
  IFNULL((case when ANY_VALUE(DATE_FORMAT(d.pdate,'%b')) = 'Jan' then CEILING((SUM(IF(t.transaction_type='Buy',t.quantity,t.quantity * -1)) * ANY_VALUE(d.dividend) ) / 100) end),0) AS Janx,
  IFNULL((case when ANY_VALUE(DATE_FORMAT(d.pdate,'%b')) = 'Feb' then CEILING((SUM(IF(t.transaction_type='Buy',t.quantity,t.quantity * -1)) * ANY_VALUE(d.dividend) ) / 100) end),0) AS Febx,

谢谢科林


推荐阅读