mysql, как отобразить значения в одной строке для каждого портфеля, акции - PullRequest
1 голос
/ 06 апреля 2019

Мне нужно отображать по одной строке для каждой комбинации портфель / акция, показывая оплату за каждый месяц, поэтому, если компания платит дважды в год в мае и сентябре соответственно 441 и 215, это будет показано в одной строке.В настоящее время мой запрос выводит строку для каждого платежа со столбцами Янв - Дек

Я пытался использовать подзапрос безрезультатно, у меня заканчиваются идеи о том, как этого добиться.

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.

Любая помощь оченьоценил.

Спасибо

Колин

1 Ответ

1 голос
/ 06 апреля 2019

Вы можете использовать функцию агрегирования в подзапросе

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...