首页 > 试题广场 >

从 Products 表中检索所有的产品名称以及对应的销售总

[编程题]从 Products 表中检索所有的产品名称以及对应的销售总
  • 热度指数:93955 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
 Products 表中检索所有的产品名称:prod_name、产品id:prod_id
prod_id prod_name
a0001 egg
a0002
sockets
a0013
coffee
a0003
cola
OrderItems代表订单商品表,订单产品:prod_id、售出数量:quantity
prod_id quantity
a0001 105
a0002
1100
a0002 200
a0013
1121
a0003
10
a0003
19
a0003
5
【问题】
编写 SQL 语句,从 Products 表中检索所有的产品名称(prod_name),以及名为 quant_sold 的计算列,其中包含所售产品的总数(在 OrderItems 表上使用子查询和 SUM(quantity)检索)。

【示例结果】返回产品名称prod_name和产品售出数量总和
prod_name quant_sold
egg 105
sockets 1300
coffee
1121
cola 34
【示例解析】prod_name是cola的prod_id为a0003,quantity总量为34,返回结果无需排序。
示例1

输入

DROP TABLE IF EXISTS `Products`;
CREATE TABLE IF NOT EXISTS `Products` (
`prod_id` VARCHAR(255) NOT NULL COMMENT '产品 ID',
`prod_name` VARCHAR(255) NOT NULL COMMENT '产品名称'
);
INSERT INTO `Products` VALUES ('a0001','egg'),
('a0002','sockets'),
('a0013','coffee'),
('a0003','cola');

DROP TABLE IF EXISTS `OrderItems`;
CREATE TABLE IF NOT EXISTS `OrderItems`(
	prod_id VARCHAR(255) NOT NULL COMMENT '产品id',
	quantity INT(16) NOT NULL COMMENT '商品数量'
);
INSERT `OrderItems` VALUES ('a0001',105),('a0002',1100),('a0002',200),('a0013',1121),('a0003',10),('a0003',19),('a0003',5);

输出

egg|105.000
sockets|1300.000
coffee|1121.000
cola|34.000
1.
select prod_name,sum(quantity) quant_sold
from Products
join OrderItems
using(prod_id)
group by 1
2.
select prod_name,
(select sum(quantity) from OrderItems where OrderItems.prod_id=Products.prod_id) quant_sold 
from Products
3.
select prod_name,quant_sold
from
(select prod_id,sum(quantity) quant_sold from OrderItems group by prod_id) o
,Products
where o.prod_id=Products.prod_id

编辑于 2023-11-27 13:42:34 回复(0)
更多回答
写法很多种,多练练就会了
一、
SELECT prod_name,
       (SELECT SUM(quantity)
        FROM OrderItems
        WHERE OrderItems.prod_id = Products.prod_id) AS quant_sold
FROM Products;

二、
SELECT prod_name,
       quant_sold
FROM Products, (SELECT prod_id, SUM(quantity) AS quant_sold
                FROM OrderItems
                GROUP BY prod_id) AS OI
WHERE Products.prod_id = OI.prod_id;

三、
SELECT prod_name, SUM(quantity)
FROM Products LEFT JOIN OrderItems
ON(Products.prod_id = OrderItems.prod_id)
GROUP BY prod_name;

发表于 2022-03-15 17:42:35 回复(17)
# 1.首先从OrderItems表中查询每一个prod_id对应的quant_sold 形成虚拟表t1
# 2.将虚拟表t1和Products表形成内连接 查询出prod_name和quant_sold

select prod_name,quant_sold
from  (
         select prod_id,sum(quantity) as quant_sold
         from OrderItems
         group by prod_id
     ) t1
inner join Products t2 on t2.prod_id = t1.prod_id
发表于 2022-03-06 11:55:26 回复(1)
select prod_name, sum(quantity) quant_sold
from Products a, OrderItems b
where a.prod_id = b.prod_id
group by prod_name


发表于 2022-03-04 11:37:17 回复(3)

注意要使用groupby
这样的题好多呀,累了,毁灭吧。

select prod_name,sum(quantity) as quant_sold
from Products t inner join OrderItems t1 on t.prod_id = t1.prod_id
group by prod_name

其他方法 略

发表于 2022-08-15 19:50:20 回复(2)
SELECT prod_name, SUM(quantity) AS quant_sold
FROM OrderItems LEFT JOIN Products USING(prod_id)
GROUP BY prod_name
发表于 2022-03-03 15:37:36 回复(0)
# 根据prod_id分组不行吗?测试一下报数组越界异常
select prod_name,sum(OrderItems.quantity) as quant_sold
from Products,OrderItems
where OrderItems.prod_id=Products.prod_id
group by Products.prod_id; 


发表于 2022-09-20 10:10:55 回复(2)

一、标量子查询:即题意要求在 OrderItems 表上使用子查询和 SUM(quantity)检索

select
    prod_name,
    (select sum(quantity) from OrderItems
    where OrderItems.prod_id = Products.prod_id) as quant_sold
from Products;
当返回结果是单一值,没有其他列时,例如此数返回只是sum(quantity),就可以通过标量子查询:聚合函数() + where table1.column = talbe2.column的形式实现了分组聚合的效果而没有显式的使用group by。标量子查询的运行效率可能不如 GROUP BY,因为数据库引擎需要执行嵌套查询,并为每个外部查询的行执行一个子查询。这可能导致更多的计算和资源消耗,可读性也不如group by清晰好理解。

二、使用group by 

select 
    p.prod_name,
    o.quant_sold
from Products as p
left join (
    select prod_id, sum(quantity) as quant_sold
    from OrderItems
    group by prod_id) as o
on p.prod_id = o.prod_id;
两个表一个表Products两列,一个使用group by 得到quant_sold的新表o,输出结果无非是两个表的联结
1. 显示连接:from p left join o on p.prod_id = o.prod_id
2. 隐式连接:from p, o where p.prod_id = o.prod_id 实现和inner join on 格式相同的效果

按照常见的SQL教程中,标量子查询用的不多,隐式连接也不多不常用,都在复杂查询时可读性差不容易理解。

编辑于 2023-12-19 17:51:38 回复(0)
select prod_name,
    (
        select sum(quantity)
        from OrderItems as oi
        where oi.prod_id=p.prod_id
    ) as quant_sold
from Products as p;
子查询用法总结:http://mp.weixin.qq.com/s/6g7Fxw1rvxnamNsfRWcqAA
发表于 2023-03-05 13:29:05 回复(1)
select
  prod_name,
  sum(quantity) as quant_sold
from
  Products,
  OrderItems
where
  OrderItems.prod_id = Products.prod_id
group by
  prod_name


发表于 2022-07-21 10:14:42 回复(0)
select prod_name,sum(quantity) quant_sold
from  Products a,OrderItems b
where a.prod_id = b.prod_id
group by prod_name
发表于 2022-07-13 22:52:16 回复(0)
select prod_name,sum(quantity) as quant_sold
from Products
join
OrderItems
using(prod_id)
group by prod_name
发表于 2022-04-27 16:32:11 回复(0)
1、连表查询
select p.prod_name,
    sum(o.quantity) as quant_sold
from Products p
inner join OrderItems o
on p.prod_id = o.prod_id
group by p.prod_name
2、子查询
select prod_name,
    (select sum(quantity) 
    from OrderItems
    where Products.prod_id = OrderItems.prod_id)
    as quant_sold
from Products



编辑于 2024-01-20 13:30:01 回复(0)
select 

prod_name
,sum(quantity) quantity

from Products a

left join  OrderItems b

on a.prod_id =b.prod_id
group by prod_name

发表于 2023-05-27 14:40:16 回复(0)
select
    prod_name,
    quant_sold
from
    Products,
    (
        select
            prod_id,
            sum(quantity) as quant_sold
        from
            OrderItems
        group by
            prod_id
    ) as OrderItemsAfter
where
    Products.prod_id=OrderItemsAfter.prod_id
发表于 2023-03-14 16:45:26 回复(0)
select P.prod_name,T.quant_sold
from (
    select prod_id,sum(quantity) quant_sold
    from OrderItems
    group by prod_id
) T right join  Products P using(prod_id)

发表于 2022-10-18 17:13:05 回复(0)
子查询方法
select prod_name, quant_sold
from Products as a, (
    select prod_id, sum(quantity) as quant_sold
    from OrderItems
    group by prod_id) as b
where a.prod_id = b.prod_id

发表于 2022-09-02 15:35:23 回复(0)
select p.prod_name, sum(oi.quantity) as quant_sold
from OrderItems as oi join Products as p
on oi.prod_id = p.prod_id # 用on要显式的用join。这里可以和where替换,区别在where是联结后过滤,on是联结前过滤
group by p.prod_name # 分组的字段一定是select的字段,不能用p.prod_id
发表于 2022-08-14 21:33:27 回复(0)
select prod.prod_name ,items.quant_sold from Products prod
join 
(select prod_id,sum(quantity) quant_sold from OrderItems group by prod_id) items
using(prod_id);

发表于 2022-03-03 23:55:36 回复(0)
SELECT
    prod_name,
    quant_sold
FROM
    (
        SELECT
            prod_name,
            SUM(quantity) AS quant_sold
        FROM
            OrderItems
            JOIN Products USING (prod_id)
        GROUP BY
            prod_name
    ) AS total

发表于 2024-11-19 16:41:11 回复(0)