Фильтровать таблицу базы данных - PullRequest
0 голосов
/ 24 августа 2018

У меня есть таблица, как показано ниже

  |-----|-----|--------|
  | id  | num | amount |
  |-----|-----|--------|
  | 101 | a   |     10 |      
  | 102 | a   |      6 |   
  | 102 | a   |      3 |
  | 101 | b   |      5 |
  | 101 | a   |     10 |
  | 101 | b   |      5 |           
  |-----|-----|--------|

То, что я хочу отобразить, это

  |---------------------|------------------|---------------------|
  |        id           |     num          |        amount       |
  |---------------------|------------------|---------------------|
  |       101           |       a,b        |          5          |        
  |---------------------|------------------|---------------------|

Т.е. если два разных значения в таблице num имеют одинаковый идентификатор, то их сумма добавляется и делится на 3, а остальные отбрасываются. Как я могу добиться этого с помощью MySQL ?? Если одни и те же данные повторяются дважды, то берется только одно и первое вхождение, а другое исключается

Я пытался

SELECT id, GROUP_CONCAT(DISTINCT num) AS nums, SUM(amount) / 3 AS amount
FROM table1
GROUP BY id
HAVING COUNT(DISTINCT num) > 1

Но он вычисляет оба значения, т. Е. Сумма равна 10 вместо 5.

Ответы [ 2 ]

0 голосов
/ 24 августа 2018

Это сложная проблема, поскольку в таблице нет естественного порядка.Таким образом, мы должны создать искусственный порядок, генерируя номера строк для каждой записи в таблице.Мы делаем это с помощью этого запроса:

SELECT @rownum1 := @rownum1 + 1 AS rownum, id, num, amount
FROM table1
JOIN (SELECT @rownum1 := 0) r

Это дает следующий вывод:

rownum  id      num     amount
1       101     a       10
2       102     a       6
3       102     a       3
4       101     b       5
5       101     a       3
6       101     b       5

После того, как мы это сделали, теперь мы можем выбрать набор значений для каждой комбинацииid и num, которые представляют «первые» записи в таблице:

SELECT id, num, MIN(rownum) AS rownum
FROM (SELECT @rownum2 := @rownum2 + 1 AS rownum, id, num, amount
      FROM table1
      JOIN (SELECT @rownum2 := 0) r
      ) t
GROUP BY id, num;

Вывод:

id      num     rownum
101     a       1
101     b       4
102     a       2

Теперь, когда у нас есть эта информация, мы можем JOINотсортировать таблицу к этой информации, а затем использовать исходный запрос к этому набору результатов, чтобы получить результаты для «первых» вхождений каждого набора значений:

SELECT t1.id, GROUP_CONCAT(DISTINCT t1.num) AS nums, SUM(t1.amount) / 3 AS amount
FROM (SELECT @rownum1 := @rownum1 + 1 AS rownum, id, num, amount
      FROM table1
      JOIN (SELECT @rownum1 := 0) r
      ) t1
JOIN (SELECT id, num, MIN(rownum) AS rownum
      FROM (SELECT @rownum2 := @rownum2 + 1 AS rownum, id, num, amount
            FROM table1
            JOIN (SELECT @rownum2 := 0) r
            ) t
      GROUP BY id, num) t2
    ON t1.rownum = t2.rownum
GROUP BY t1.id
HAVING COUNT(DISTINCT t1.num) > 1;

Вывод:

id      nums    amount
101     a,b     5

SQLFiddle

0 голосов
/ 24 августа 2018

вы можете использовать подзапрос для различных и присоединиться с идентификатором с количеством> 1

  select  t1.id, GROUP_CONCAT( t1.num) AS nums, SUM(t1.amount) / 3 AS amount
  from (
     select distinct  id, num, amount
     from table1  
     group by id, num
  ) t1
  INNER JOIN (
    select id, num, count(*)
    from table1
    group by id, num 
    having count(*)>1 

  ) t2 on t2.id = t1.id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...