【问题标题】:Selected grouped but not related records选定的分组但不相关的记录
【发布时间】:2020-06-25 11:13:21
【问题描述】:

我正在尝试构建 SQL 查询(应该在 Oracle 和 SQL 服务器上都可以使用)。我的桌子:

CATEGORIES:
ID: PK
DESCRIPTION: Varchar(255)

示例:1:水果; 2:蔬菜; 3:肉类;

FOODS
ID: PK
DESCRIPTION: Varchar(255)

示例:1:香蕉; 2:苹果; 3:鸡蛋;

CATEGORIES X FOODS
ID: PK
FOODS_FK
CATEGORIES_FK

示例:1:香蕉:水果; 2:苹果:水果;

如您所见,有些食物与类别无关(例如蛋)。

ITEMS
ID: PK
NAME: Varchar(255)
FOOD: FOODS_FK
COST: MONEY

示例:1:红香蕉:香蕉:$2,99; 2:大鸡蛋:鸡蛋:1.87 美元;

我想构建一个列出所有类别及其成本总和的查询,即使食品与类别无关(称为“其他”),如下所示:

Fruits:  $10,00
Vegetables: $0
Meats: $99,00
Others: $15,00

我该怎么做?

【问题讨论】:

    标签: sql


    【解决方案1】:

    LEFT JOINGROUP BY

    select c.description,
           coalesce(sum(i.cost), 0) as cost
    from categories c left join
         category_foods cf
         on c.id = cf.category_id left join
         items i
         i.food_id = cf.food_id
    group by c.description;
    

    我发现遵循列的命名约定有点困难,但列之间的关系应该很清楚。

    【讨论】:

    • “Others”记录(其食物不在类别中的项目)呢?
    • @aseolin 。 . . “我想建立一个列出所有类别及其成本总和的查询”。
    【解决方案2】:

    关键思想是在类别上使用合并来将其他人归为“其他人”。

    select
        coalesce(c.DESCRIPTION, 'Others') || ': ' || cast(coalesce(sum(i.COST),0) as varchar)
    from
        FOOD f
        left join ITEMS i on i.FOOD = f.FOOD
        left join [CATEGORIES X FOODS] cf on cf.FOOD = f.ID
        left join CATEGORIES c on c.ID = cf.CATEGORY
    group by coalesce(c.DESCRIPTION, 'Others')
    

    【讨论】:

      猜你喜欢
      • 2010-10-23
      • 1970-01-01
      • 2014-09-10
      • 2016-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-01
      相关资源
      最近更新 更多