简体   繁体   English

如何使用条件对 MySQL 中的行进行分组

[英]How to group rows in MySQL with condition

I have this table:我有这张桌子:

| 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   |

I want to group the rows like this:我想像这样对行进行分组:

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

How to do this?这该怎么做? Is this possible or not?这可能吗?

I want group the row by part number that doesn't have serial number.我想按没有序列号的零件号对行进行分组。 So if I have 4 rows with same part number that doesn't have serial number, it's only display 1 row.因此,如果我有 4 行具有相同部件号但没有序列号,则只显示 1 行。

This looks like you just want to aggregate by the combination of the part number and serial_number , taking the max quantity:看起来您只想通过part numberserial_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);

Demo 演示

Note that null is a legitimate value to form a member of a group in a GROUP BY operation.请注意, null是在GROUP BY操作中形成组成员的合法值。

This looks more like a job for NOT EXISTS .这看起来更像是NOT EXISTS的工作。

For those that have a NULL serial_number you want only to keep those with the lowest id per part_number.对于那些具有 NULL serial_number 的人,您只想保留那些每个 part_number 具有最低 id 的人。

So you just need to filter those you don't need.所以你只需要过滤那些你不需要的。

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;

Result:结果:

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

Test on db<>fiddle here这里测试db<>fiddle

Btw, in MySql 5.x, when the ONLY_FULL_GROUP_BY setting isn't active.顺便说一句,在 MySql 5.x 中,当 ONLY_FULL_GROUP_BY 设置未激活时。
Then this would give the same result.那么这将给出相同的结果。
But then it won't only be for those with NULL serial_number.但它不仅适用于那些序列号为 NULL 的人。

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

Test here在这里测试

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM