【问题标题】:SQL Join multiple tables, count, include 0 countsSQL Join多个表,count,包括0个count
【发布时间】:2015-02-03 02:22:07
【问题描述】:

我正在使用 Oracle 数据库 11g。 假设我有 3 个数据库表。一个包含有关比萨店的信息,一个包含有关人员的信息,一个包含有关订单的信息:

PIZZA_SHOP
身份证|姓名          |
1  | 多米诺骨牌
2  | 必胜客
3  | 爸爸约翰斯


姓名  | PIZZA_SHOP_FK
吉姆       | 多米诺骨牌
托德      | 必胜客
凯利     | 多米诺骨牌
弗兰克   | 爸爸约翰斯

订单
PERSON_FK  |订购
吉姆                  | 意大利辣香肠
托德                  | 奶酪
凯利                 | 意大利辣香肠
吉姆                  | 香肠
托德                   | 专业

我们想省略特色披萨。从这张表中,我们可以看到从 Dominos 订购了 2 个意大利辣香肠和 1 个香肠披萨,从必胜客订购了 1 个奶酪披萨,并且没有从 Papa Johns 订购任何东西。我想要做的是得到以下输出:

多米诺骨牌 --- 意大利辣香肠 --- 2
多米诺骨牌 --- 香肠 --- 1
多米诺骨牌 --- 奶酪 --- 0
必胜客 --- 意大利辣香肠 --- 0
必胜客 --- 香肠 --- 0
必胜客 --- 奶酪 --- 1
棒约翰---意大利辣香肠--- 0
棒约翰---香肠--- 0
棒约翰---奶酪--- 0

我尝试过的是这样的:
选择 PS.NAME、O.ORDER、COUNT(O.ORDER)
来自 PIZZA_SHOP PS
完全外联人 P
ON P.PIZZA_SHOP_FK = PS.NAME
完全外连接订单 O
ON O.PERSON_FK = P.NAME
在哪里订购(“意大利辣香肠”、“奶酪”、“香肠”)
GROUP_BY PS.NAME,PS.TYPE

但不幸的是,它不会检索任何“0”计数。我已经尝试了其他几种方法,并且开始没有想法了。谁能帮我解决一下?

【问题讨论】:

    标签: sql oracle11g


    【解决方案1】:

    这种查询背后的想法是使用cross join 创建所有行,然后使用left joingroup by 将您想要的数据组合在一起。这有点复杂,因为人员和订单之间存在这些奇怪的关系,但它仍然是可行的:

    select ps.name, toppings.order, count(o.order)
    from pizza_shop ps cross join
         (select 'Pepperoni' as order from dual union all
          select 'Cheese' from dual union all
          select 'Sausage' from dual
         ) toppings left join
         order o
         on o.order = toppings.order left join
         persons p
         on p.pizza_shop_fk = ps.name and
            p.name = o.person_fk
    group by ps.name, toppings.order;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多