在同一个表上连接的SQL计数查询

时间:2015-11-25 05:33:03

标签: sql join

如果解决方案显而易见,请提前抱歉。我已搜索但尚未找到解决方案。

我有一个包含2列的Orders表:CustID和ProductBrand。 ProductBrand是订购商品的品牌,例如索尼,惠普,戴尔等

我想获得订购至少10件物品的客户清单,其中ProductBrand = Sony但少于5件物品,而ProductBrand = HP。

我可以用这些方法来做这件事吗?

ng-submit

2 个答案:

答案 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小提琴来检查执行计划。看起来在第一种方法中正在发生更多事情。但这并不意味着当你在生产中使用时,它会更糟糕。