как сгруппировать строки в MySQL с условием - PullRequest
0 голосов
/ 27 февраля 2019

У меня есть эта таблица:

| id | part number | serial_number | qty |
==========================================
| 1  | A           | 12345         | 1   |
| 2  | A           | 54321         | 1   |
| 3  | A           | 67890         | 1   |
| 4  | B           |               | 10  |
| 5  | B           |               | 5   |
| 6  | C           |               | 6   |
| 7  | C           |               | 3   |

Я хочу сгруппировать строки следующим образом:

| id | part number | serial_number | qty |
==========================================
| 1  | A           | 12345         | 1   |
| 2  | A           | 54321         | 1   |
| 3  | A           | 67890         | 1   |
| 4  | B           |               | 10  |
| 6  | C           |               | 6   |

Как это сделать?Это возможно или нет?

Я хочу сгруппировать строку по номеру детали, который не имеет серийного номера.Поэтому, если у меня 4 строки с одинаковым номером детали, у которых нет серийного номера, отображается только 1 строка.

Спасибо

Ответы [ 2 ]

0 голосов
/ 27 февраля 2019

Это больше похоже на работу для NOT EXISTS.

Для тех, кто имеет NULL serial_number, вы хотите сохранить только те, которые имеют наименьший идентификатор для номера_части.

Так что вам просто нужночтобы отфильтровать те, которые вам не нужны.

SELECT *
FROM YourTable t
WHERE NOT EXISTS
(
   SELECT 1 
   FROM YourTable d
   WHERE d.`part number` = t.`part number`
     AND d.serial_number IS NULL
     AND t.serial_number IS NULL
     AND d.id < t.id
)
ORDER BY id;

Результат:

id | part number | serial_number | qty
-- | ----------- | ------------- | ---
 1 | A           |         12345 |   1
 2 | A           |         54321 |   1
 3 | A           |         67890 |   1
 4 | B           |         null  |  10
 6 | C           |         null  |   6

Тест по db <> fiddle здесь

Кстати, в MySql 5.x, когда настройка ONLY_FULL_GROUP_BY не активна.
Тогда это даст тот же результат.
Но тогда это будет не только для тех, у кого NULL serial_number.

SELECT *
FROM YourTable 
GROUP BY `part number`, serial_number
ORDER BY id

Тест здесь

0 голосов
/ 27 февраля 2019

Похоже, что вы просто хотите агрегировать с помощью комбинации part number и serial_number, получая максимальное количество:

SELECT
    MIN(t1.id) AS id, t1.part_number, t1.serial_number, t1.qty
FROM yourTable t1
INNER JOIN
(
    SELECT part_number, serial_number, MAX(qty) AS qty
    FROM yourTable
    GROUP BY part_number, serial_number
) t2
    ON t1.part_number = t2.part_number AND
       (t1.serial_number = t2.serial_number OR
        t1.serial_number IS NULL AND t2.serial_number IS NULL) AND
       t1.qty = t2.qty
GROUP BY
    t1.part_number,
    t1.serial_number,
    t1.qty
ORDER BY
    MIN(t1.id);

Демо

Обратите внимание, что null является допустимым значением для формирования члена группы в операции GROUP BY.

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