如果解决方案显而易见,请提前抱歉。我已搜索但尚未找到解决方案。
我有一个包含2列的Orders表:CustID和ProductBrand。 ProductBrand是订购商品的品牌,例如索尼,惠普,戴尔等
我想获得订购至少10件物品的客户清单,其中ProductBrand = Sony但少于5件物品,而ProductBrand = HP。
我可以用这些方法来做这件事吗?
ng-submit
答案 0 :(得分:5)
你可以在没有自我加入的情况下做到这一点,只需聚合:
select o.custid
from orders o
group by o.custid
having sum(case when o.ProductBrand = 'Sony' then 1 else 0 end) >= 10 and
sum(case when o.ProductBrand = 'HP' then 1 else 0 end) < 5;
在MySQL中,您可以通过删除case
:
select o.custid
from orders o
group by o.custid
having sum(o.ProductBrand = 'Sony') >= 10 and
sum(o.ProductBrand = 'HP') < 5;
答案 1 :(得分:0)
设置小提琴
CREATE TABLE ORDERS (cust INT, brand VARCHAR(100))
INSERT INTO ORDERS VALUES (1, 'Sony')
INSERT INTO ORDERS VALUES (1, 'Sony')
INSERT INTO ORDERS VALUES (1, 'Sony')
INSERT INTO ORDERS VALUES (1, 'Hp')
INSERT INTO ORDERS VALUES (1, 'Hp')
INSERT INTO ORDERS VALUES (2, 'Sony')
INSERT INTO ORDERS VALUES (2, 'Sony')
INSERT INTO ORDERS VALUES (2, 'Hp')
INSERT INTO ORDERS VALUES (2, 'Hp')
INSERT INTO ORDERS VALUES (2, 'Hp')
INSERT INTO ORDERS VALUES (2, 'Hp')
INSERT INTO ORDERS VALUES (3, 'Sony')
INSERT INTO ORDERS VALUES (3, 'Sony')
INSERT INTO ORDERS VALUES (3, 'Sony')
INSERT INTO ORDERS VALUES (3, 'Hp')
INSERT INTO ORDERS VALUES (3, 'Hp')
查询
方法1
select
sony.custId
from
(select cust as custId, Brand, count(*) as count
from orders
where Brand = 'Sony'
group by cust, brand) Sony
inner join
(select cust as custId, Brand, count(*) as count
from orders
where Brand = 'Hp'
group by cust, brand) Hp
on sony.custId = hp.CustId
Where
sony.count > 2 and
hp.count < 5
这对你理解关系很有帮助。这是另一种方式
方法2
select cust
from orders
group by cust, brand
having count(case brand when 'Sony' then 'x' end) > 2 and
count(case brand when 'Hp' then 'x' end) < 5
时间大致相同 - 确定它会根据数据量,索引等而有所不同。使用Sql小提琴来检查执行计划。看起来在第一种方法中正在发生更多事情。但这并不意味着当你在生产中使用时,它会更糟糕。