Деление каждой строки на сумму строк, имеющих одинаковое значение двух столбцов - PullRequest
0 голосов
/ 10 октября 2018

Я хочу рассчитать деление каждой строки на сумму всех строк, имеющих одинаковые Дата добавления и fundid , но, похоже, мой запрос неверен, поскольку результаты нечто я ожидалМоя схема таблицы выглядит следующим образом, я избежал моей, потому что в ней много столбцов:

+----+--------+------------+--------+
| id | fundid | Dateadded  | amount |
+====+========+============+========+
| 1  |  45    | 21-02-2018 |  5412  |
| 2  |  45    | 21-02-2018 |  5414  |
| 3  |  45    | 21-02-2018 |  1412  |
| 4  |  45    | 22-02-2018 |  5756  |
| 5  |  45    | 22-02-2018 |  4412  |
| 6  |  45    | 25-02-2018 |  2532  |
| 7  |  45    | 26-02-2018 |  7892  |
| 8  |  45    | 26-02-2018 |  8143  |
+----+-------+-------------+--------+
  • Строки с идентификаторами: 1,2,3 должны рассчитываться вместе, поскольку они имеют одинаковыеfundid и date.

  • Строки с идентификаторами: 4,5 То же самое.

  • Строки с идентификаторами: 6 это только один.
  • Строки с идентификаторами: 7,8 одно и то же.

Мой SQL-запрос:

SELECT fundid
     , Dateadded
     , ( amount / SUM(amount) ) AS AvgRow 
  FROM stock2 
 GROUP 
    BY fundid
     , Dateadded 
 ORDER 
    BY DateAdded ASC

Ответы [ 2 ]

0 голосов
/ 10 октября 2018

Ознакомьтесь с очень хорошо объясненным ответом на похожую проблему, связанную с использованием Group здесь ).

Аналогично описанной там ситуации, для вашейвопрос неоднозначен: какое количество нужно использовать для каждой строки.Т.е. если вы попробуете:

    SELECT fundid, Dateadded, ( AVG(amount) / SUM(amount) ) AS AvgRow FROM stock2 GROUP BY fundid, Dateadded ORDER BY DateAdded ASC

, это сработает, потому что AVG (сумма) не является неоднозначным для каждой пары (fundid, Dateadded) , которая должна быть рассчитанавсе вместе.

Кажется, вы ищете что-то вроде:

   SELECT st.fundid, st.Dateadded, ( amount / st2.total) ) AS AvgRow 
   FROM stock2 st 
   inner join 
      (select fundid, Dateadded, sum(amount) as total
       from stock2
       GROUP BY fundid, Dateadded) st2 
   on st.fundid = st2.fundid and st.Dateadded = st2.Dateadded
   order by st.Dateadded
0 голосов
/ 10 октября 2018

Это то, что вы хотите?

select t.*, t.amount / tt.total_amount
from stock2  t join
     (select fundid, dateadded, sum(amount) as total_amount
      from stock2 t
      group by fundid, dateadded
     ) tt
     using (fundid, dateadded);

Или это?

select fundid, dateadded, sum(t.amount) / tt.total_amount
from stock2  t cross join
     (select sum(amount) as total_amount
      from stock2 t
     ) tt
 group by fundid, dateadded, tt.total_amount;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...