【问题标题】:mysql how to display values on one row for each portfolio, stockmysql如何在一行上显示每个投资组合、股票的值
【发布时间】:2019-04-06 18:03:32
【问题描述】:

我需要为每个投资组合/股票组合显示一行,显示每个月的付款,因此如果一家公司在 5 月和 9 月分别支付 441 和 215 每年两次,这将显示在一行中。目前我的查询为每次付款输出一行,列 Jan - Dec

我尝试使用子查询无济于事,我对如何实现这一点没有任何想法。

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 Jan,
    (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 Feb,
    (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 Mar,
    (case when ANY_VALUE(DATE_FORMAT(d.pdate,'%b')) = 'Apr' then IFNULL(CEILING((SUM(IF(t.transaction_type='Buy',t.quantity,t.quantity * -1)) * ANY_VALUE(d.dividend) ) / 100),0) end) AS Apr,
    (case when ANY_VALUE(DATE_FORMAT(d.pdate,'%b')) = 'May' then IFNULL(CEILING((SUM(IF(t.transaction_type='Buy',t.quantity,t.quantity * -1)) * ANY_VALUE(d.dividend) ) / 100),0) end) AS May,
    (case when ANY_VALUE(DATE_FORMAT(d.pdate,'%b')) = 'Jun' then IFNULL(CEILING((SUM(IF(t.transaction_type='Buy',t.quantity,t.quantity * -1)) * ANY_VALUE(d.dividend) ) / 100),0) end) AS Jun,
    (case when ANY_VALUE(DATE_FORMAT(d.pdate,'%b')) = 'Jul' then IFNULL(CEILING((SUM(IF(t.transaction_type='Buy',t.quantity,t.quantity * -1)) * ANY_VALUE(d.dividend) ) / 100),0) end) AS Jul,
    (case when ANY_VALUE(DATE_FORMAT(d.pdate,'%b')) = 'Aug' then IFNULL(CEILING((SUM(IF(t.transaction_type='Buy',t.quantity,t.quantity * -1)) * ANY_VALUE(d.dividend) ) / 100),0) end) AS Aug,
    (case when ANY_VALUE(DATE_FORMAT(d.pdate,'%b')) = 'Sep' then IFNULL(CEILING((SUM(IF(t.transaction_type='Buy',t.quantity,t.quantity * -1)) * ANY_VALUE(d.dividend) ) / 100),0) end) AS Sep,
    (case when ANY_VALUE(DATE_FORMAT(d.pdate,'%b')) = 'Oct' then IFNULL(CEILING((SUM(IF(t.transaction_type='Buy',t.quantity,t.quantity * -1)) * ANY_VALUE(d.dividend) ) / 100),0) end) AS Oct,
    (case when ANY_VALUE(DATE_FORMAT(d.pdate,'%b')) = 'Nov' then IFNULL(CEILING((SUM(IF(t.transaction_type='Buy',t.quantity,t.quantity * -1)) * ANY_VALUE(d.dividend) ) / 100),0) end) AS Nov

    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
    p.code = 'SFT_DEA_CO'
    AND
    s.symbol = 'AV..L'
    AND
    t.user_id =2
    GROUP BY
    s.symbol, d.pdate

输出

Symbol Portfolio  Jan  Feb  Mar  Apr  May  Jun  Jul  Aug  Sep  Oct 
AV..L  SFT_DEA_CO NULL NULL NULL NULL 441  NULL NULL NULL NULL NULL 
AV..L  SFT_DEA_CO NULL NULL NULL NULL NULL NULL NULL NULL 215  NULL 

下面需要的输出

Symbol Portfolio  Jan  Feb  Mar  Apr  May  Jun  Jul  Aug  Sep  Oct 
AV..L  SFT_DEA_CO                     441                 215 

对于给定的交易品种、投资组合,我需要一行并且没有 NULL 值。

非常感谢任何帮助。

谢谢

科林

【问题讨论】:

    标签: php mysql wordpress


    【解决方案1】:

    您可以在子查询上使用聚合函数

    select  t.Symbol, t.Portfolio
      , max(Jan)
      , max(feb)
      , max(Mar)
      , max(Apr)
      , max(May)
      , max(Jun)
      , max(Jul)
      , max(Aug)
      , max(Sep)
      , max(Oct)
      , max(Nov)
    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 Jan,
      (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 Feb,
      (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 Mar,
      (case when ANY_VALUE(DATE_FORMAT(d.pdate,'%b')) = 'Apr' then IFNULL(CEILING((SUM(IF(t.transaction_type='Buy',t.quantity,t.quantity * -1)) * ANY_VALUE(d.dividend) ) / 100),0) end) AS Apr,
      (case when ANY_VALUE(DATE_FORMAT(d.pdate,'%b')) = 'May' then IFNULL(CEILING((SUM(IF(t.transaction_type='Buy',t.quantity,t.quantity * -1)) * ANY_VALUE(d.dividend) ) / 100),0) end) AS May,
      (case when ANY_VALUE(DATE_FORMAT(d.pdate,'%b')) = 'Jun' then IFNULL(CEILING((SUM(IF(t.transaction_type='Buy',t.quantity,t.quantity * -1)) * ANY_VALUE(d.dividend) ) / 100),0) end) AS Jun,
      (case when ANY_VALUE(DATE_FORMAT(d.pdate,'%b')) = 'Jul' then IFNULL(CEILING((SUM(IF(t.transaction_type='Buy',t.quantity,t.quantity * -1)) * ANY_VALUE(d.dividend) ) / 100),0) end) AS Jul,
      (case when ANY_VALUE(DATE_FORMAT(d.pdate,'%b')) = 'Aug' then IFNULL(CEILING((SUM(IF(t.transaction_type='Buy',t.quantity,t.quantity * -1)) * ANY_VALUE(d.dividend) ) / 100),0) end) AS Aug,
      nax(case when ANY_VALUE(DATE_FORMAT(d.pdate,'%b')) = 'Sep' then IFNULL(CEILING((SUM(IF(t.transaction_type='Buy',t.quantity,t.quantity * -1)) * ANY_VALUE(d.dividend) ) / 100),0) end) AS Sep,
      (case when ANY_VALUE(DATE_FORMAT(d.pdate,'%b')) = 'Oct' then IFNULL(CEILING((SUM(IF(t.transaction_type='Buy',t.quantity,t.quantity * -1)) * ANY_VALUE(d.dividend) ) / 100),0) end) AS Oct,
      (case when ANY_VALUE(DATE_FORMAT(d.pdate,'%b')) = 'Nov' then IFNULL(CEILING((SUM(IF(t.transaction_type='Buy',t.quantity,t.quantity * -1)) * ANY_VALUE(d.dividend) ) / 100),0) end) AS Nov
    
      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 p.code = 'SFT_DEA_CO'
      AND s.symbol = 'AV..L'
      AND t.user_id =2
      GROUP BY    s.symbol,d.pdate
    ) t
    GROUP BY   symbol, code
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-11
      相关资源
      最近更新 更多