我有一张表:

prod_name - quantity - group
tv        - 30  - base 
microwave - 10  - base 
watch     - 5   - base  
phone     - 25  - base 
washer    - 15  - base 
dryer.    - 14  - base  
microwave - 7   - inventory_2021 
phone     - 16  - inventory_2021  
tv        - 30  - inventory_2022 
watch     - 5   - inventory_2022 
phone     - 25  - inventory_2022 

我要填写/输入从基础(组)到所有其他组的缺失记录

预期输出:

tv        - 30  - base 
microwave - 10  - base 
watch     - 5   - base 
phone     - 25  - base 
washer    - 15  - base 
dryer.    - 14  - base 
tv        - 30  - inventory_2021 
microwave - 7   - inventory_2021 
watch     - 5   - inventory_2021 
phone     - 16  - inventory_2021 
washer    - 15  - inventory_2021 
dryer.    - 14  - inventory_2021 
tv        - 30  - inventory_2022 
microwave - 10  - inventory_2022 
watch     - 5   - inventory_2022 
phone     - 25  - inventory_2022 
washer    - 15  - inventory_2022 
dryer.    - 14  - inventory_2022 

因此,在输出中,我在每个组中有相同数量的条目,并且条目总数应该与基本组匹配.

推荐答案

MySQL和Presto/Trino是两种有点不同的SQL方言.基本思路是一样的--打造产品和群体的笛卡尔产品的"基".如果您确定所有产品都在基地,您可以简单地使用以下Presto/Trino:

-- sample data
WITH dataset(prod_name, quantity, "group") as (
    values ('tv'       , 30, 'base'),
        ('microwave', 10, 'base'),
        ('watch'    , 5 , 'base'),
        ('phone'    , 25, 'base'),
        ('washer'   , 15, 'base'),
        ('dryer'   , 14, 'base'),
        ('microwave', 7 , 'inventory_2021'),
        ('phone'    , 16, 'inventory_2021'),
        ('tv'       , 30, 'inventory_2022'),
        ('watch'    , 5 , 'inventory_2022'),
        ('phone'    , 25, 'inventory_2022')
),
-- query parts
base_products AS (
    SELECT prod_name, quantity
    FROM dataset AS p1
    WHERE "group" = 'base' -- select all base products
),
all_groups as (
    SELECT distinct "group" grp
    FROM dataset
),
base_all as(
    SELECT b.prod_name, b.quantity, grp -- build base lookup table
    FROM base_products b
    CROSS JOIN all_groups
)

select b.prod_name,
    coalesce(d.quantity, b.quantity) quantity, -- use "original" quantity
    b.grp "group"
from base_all b
left join dataset d on b.prod_name = d.prod_name and b.grp = d."group"
;

输出:

prod_name quantity group
tv 30 inventory_2021
microwave 7 inventory_2021
watch 5 inventory_2021
phone 16 inventory_2021
washer 15 inventory_2021
dryer 14 inventory_2021
tv 30 base
microwave 10 base
watch 5 base
phone 25 base
washer 15 base
dryer 14 base
tv 30 inventory_2022
microwave 10 inventory_2022
watch 5 inventory_2022
phone 25 inventory_2022
washer 15 inventory_2022
dryer 14 inventory_2022

Mysql相关问答推荐

MySQL查询获取图书的唯一读取页面数

根据计数按月和年对数据进行分组()

Google Sheet查询以提取数据并用值替换复选框.(差异)

MySQL:一个查询中的SELECT语句,用于从一个表中检索所有数据,并仅从另一个表中检索一个数据

使用NOT EXISTS()时出现MySQL查询错误

Mysql-查找缺少列的表

根据 JOIN 结果计算列中的值?

如何根据购买的商品数量查找 unique_ids 的数量

拆分列值并适当地返回拆分值

从多到多表中 Select 数据而无需重复

从 2 个不同的表中获取数据并将它们加入 sql

了解 SQL 中的元组语法

mysql - 如何加入表中的动态列

如何过滤表格,以便它显示最新的数据?

MariaDB 下的慢速更新、删除和插入查询

如何查看打开了多少 MySQL 连接?

不是唯一的表/别名

MAMP mysql 服务器无法启动.没有mysql进程正在运行

mysql中float(2,2)和float()的区别

MySQL 整数与日期时间索引