我有以下查询:
select pt_product_name,
(select
sum(sal_qty)
from sales_tb as sal
where pt.pt_productid=sal.sal_pt_productid
and sal.sal_updated_time>curdate()
) as salQty
from product_tb as pt
它为每个产品返回sal_qty的sum
,但我希望sum
基于不同的产品。
你能指点我正确的方向吗,我错过了什么?感谢。
答案 0 :(得分:0)
将GROUP BY pt.pt_productid
添加到您的select语句,以将sum()
应用于产品组。
另请考虑使用JOIN
而不是嵌套选择。
<强>更新强>
select pt_product_name,
(select sum(sal_qty) from sales_tb as sal
where pt.pt_productid=sal.sal_pt_productid
and sal.sal_updated_time>curdate()
) as salQty
from product_tb as pt
group by pt.pt_productid;
使用 JOIN
:
select pt_product_name, sum(sal_qty) as salQty
from product_tb as pt
left outer join sales_tb sal on (pt.pt_productid = sal.sal_pt_productid
and sal.sal_updated_time>curdate())
group by pt.pt_productid
这是一个填充了示例值的示例表结构,以及查询工作正常的演示:
DROP TABLE IF EXISTS `temp_db`.`product_tb`;
CREATE TABLE `temp_db`.`product_tb` (
pt_productid int(10) not null auto_increment,
pt_product_name varchar(20) not null,
primary key (`pt_productid`)
) ENGINE=INNODB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
DROP TABLE IF EXISTS `temp_db`.`sales_tb`;
CREATE TABLE `temp_db`.`sales_tb` (
sal_saleid int(10) not null auto_increment,
sal_pt_productid int(10) not null references product_tb.pt_productid,
sal_qty int(10) default 0,
sal_updated_time timestamp not null default current_timestamp,
primary key (`sal_saleid`)
) ENGINE=INNODB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
将样本数据添加到表中:
insert into product_tb(pt_product_name) values
('prod1'), ('prod2'), ('prod3'), ('prod4');
insert into sales_tb(sal_pt_productid, sal_qty) values
(1, 40), (1, 40), (1, 10), (1, 20),
(2, 4), (2, 4), (2, 4), (2, 4),
(3, 1), (3, 1), (3, 1),
(4, 5), (4, 5);
select语句的结果(都返回相同的结果集):
# pt_product_name, salQty
prod1 110
prod2 16
prod3 3
prod4 10
注意,如果数量仅在今天或之后销售 * ,则只会对其进行求和! sal_update_time > curdate();
如果产品没有curdate()或更高版本的任何销售,它甚至不会出现在列表中。这并不意味着选择错误,这意味着您没有正确指定目标是什么。
答案 1 :(得分:0)
select
pt.pt_product_name,
sum(sal.sal_qty) as salQty
from
product_tb as pt
left join
sales_tb as sal on pt.pt_productid = sal.sal_pt_productid
where
sal.sal_updated_time > curdate()
group by pt.pt_productid
此查询将所有产品与各自的销售相结合。然后,它将同一产品的所有记录组合在一起。然后根据当前日期过滤记录。这些组中的每一组将包含单个产品的每次销售的一个记录。最后,在选择中,我们总结每个组的所有销售数量。