连接比较

时间:2015-04-09 19:50:49

标签: sql sql-server

假设我有一张表格,其中所有销售都名为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%以上。有什么想法吗?

3 个答案:

答案 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