假设我有一张表格,其中所有销售都名为sales,其中包含itemid,storeid,sale和date
然后我有一个名为storeregion的表,其中包含storeid和region列。如果我想在特定日期范围内获得某个地区的销售:
select region, sum(sale)
from sales s
inner join storeregion sr on s.storeid=sr.storeid
where date between 'whatever' and 'whatever'
group by region
所以我得到这样的结果:
东| 500
西| 400
好酷。现在,我还有一个名为itemcategory的表,其中包含itemid和category列。我希望看到每个地区的每个类别的销售情况。我可以做这样的事情。
select sr.region, ic.category, sum(sale)
from sales s
inner join storeregion sr on s.storeid=sr.storeid
inner join itemcategory ic on s.itemid=ic.itemid
where date between 'whatever' and 'whatever'
group by sr.region
group by ic.category
所以我得到这样的结果:
东|玩具| 100
东|书籍| 200
东|游戏| 200
西|玩具| 300
西|游戏| 100
现在我真正想要做的是找到一个地区的一个类别的销售额超过该地区总销售额的50%。因此,根据我在第一个查询中的示例,我得到了结果:
西| 400
并在第二个查询中得到结果:
西|玩具| 300
超过该地区总销售额的50%。
我想写一个只给我结果的查询
西|玩具| 300
因为它占该地区销售额的50%以上。有什么想法吗?
答案 0 :(得分:3)
使用子查询执行此操作。将您的查询加入到按地区计算总数的子查询中,条件为sales>占总数的50%:
select sr.region, ic.category, sum(sale) sales
from sales s
inner join storeregion sr on s.storeid=sr.storeid
inner join itemcategory ic on s.itemid=ic.itemid
INNER JOIN
(
select region, sum(sale) sales
from sales s
inner join storeregion sr on s.storeid=sr.storeid
where date between 'whatever' and 'whatever'
group by region
) st ON sr.region = st.region
where date between 'whatever' and 'whatever'
group by sr.region,ic.category, st.sales
having sum(sale) > st.sales * 0.50
请注意,条件需要在HAVING子句中,因为它适用于组总数,而不是记录值。
答案 1 :(得分:1)
您应该使用窗口函数执行此操作:
select rc.*
from (select sr.region, ic.category, sum(sale) as catsale,
sum(sum(sale)) over (partition by region) as regsale
from sales s inner join
storeregion sr
on s.storeid = sr.storeid inner join
itemcategory ic
on s.itemid = ic.itemid
where date between 'whatever' and 'whatever'
group by sr.region, ic.category
) rc
where catsale >= 0.5 * regsale;
通常,窗口函数不仅会导致查询更短,而且与使用多个连接和聚合的等效查询相比,它们的性能也更好。
答案 2 :(得分:0)
您需要执行以下操作:
select a.region, a.category, a.sales from (
your first query
) as a join (
your second query
) as b on join both
having b.sales > a.sales / 2