具有多个键的表的SQL查询?

时间:2017-02-08 02:43:28

标签: sql

我很抱歉,如果这看起来太容易了,但我被问到这个问题,即使在彻底准备SQL之后我也无法回答:(。有人可以回答这个问题吗?

有一张表 - 卖家ID,产品ID,仓库ID,每个产品的每个产品的数量,按照每个卖家。

我们必须列出具有卖方ID的产品ID,该产品ID具有该产品的最高产品数量以及他对该产品的总产品数量。

我觉得我很困惑,因为表中有3个键。

3 个答案:

答案 0 :(得分:1)

目前还不清楚您使用的是哪个DBMS。如果您的DBMS支持窗口正常运行,则以下内容应该有效。

您可以找到每个产品和卖家的行数,使用窗口函数rank对每个产品中的每个卖家进行排名,然后使用过滤器来获取每个产品中排名最高的卖家以及单位数。

select
    product_id,
    seller_id,
    no_of_products
from (
    select 
        product_id,
        seller_id,
        count(*) no_of_products,
        rank() over (partition by product_id order by count(*) desc) rnk
    from your_table
    group by 
        product_id,
        seller_id
) t where rnk = 1;

如果不支持窗口函数,则可以使用相关查询来实现相同的效果:

select
    product_id,
    seller_id,
    count(*) no_of_products
from your_table a
group by
    product_id,
    seller_id
having count(*) = (
    select max(cnt)
    from (
        select count(*) cnt
        from your_table b
        where b.product_id = a.product_id
        group by seller_id
    ) t
);

答案 1 :(得分:0)

不知道为什么让id列会让你感到困惑......按正确的列分组,总计总数并返回第一行:

select *
from (
  select sellerid, productid, sum(quantity) as total_sold
  from theres_a_table
  group by sellerid, productid
) x
order by total_sold desc
fetch first 1 row only

答案 2 :(得分:0)

如果我不考虑优化,直接回答就是这样

select *
from
(
select seller_id, product_id, sum(product_qty) as seller_prod_qty
from your_table
group by seller_id, product_id
) spqo
inner join 
(
 select product_id, max(seller_prod_qty) as max_prod_qty
 from
 (
  select seller_id, product_id, sum(product_qty) as seller_prod_qty
  from your_table
  group by seller_id, product_id
 ) spqi
 group by product_id
) pmaxq
on spqo.product_id = pmaxq.product_id
and spqo.seller_prod_qty = pmaxq.max_prod_qty
spqi(内部)和sqpo(外部)都为您提供卖方,产品,仓库数量总和。 pmaxq在仓库中再次给出每个产品的最大值,然后如果卖方具有最高(最大)的产品(可能是具有相同数量的多个卖方),则最终内部连接将获取数量总和。我想这就是你要找的答案。但是,我确信可以改进查询,因为我发布的是"概念"一:)