我有3张桌子:

  • 商店{'ID','NAME'}
  • 产品{'ID','NAME'}
  • 订单{'SHOP_ID','PRODUCT_ID','QTY'}

orders表引用具有shop.id商店中已售出产品的product.id

我想创建一个sql视图,该视图选择每个商店的前10种产品。 因此,我希望结果表有10行(每个等级一个),并且列的数量与shop表中商店的ID一样多,每列中有10个卖家。

获得每个商店的十大产品很容易。 通过重复并加入选择以从单个商店中获取固定数量的n个商店,这也很容易,但是我不知道如何在数量可变的商店中做到这一点。 我搜索了类似的示例,我的感觉是,使用通用表表达式应该可以实现此目的,但我不理解。

所以问题是:

如何在循环或类似构造中加入可变数量的子选择

示例结果应如下所示:

'RANK' 'Berlin' 'Hamburg' 'München'
  1        2        3         4
  2        .        .         .
  .        .        .         .
  .        .        .         .
  9        .        .         .
 10        .        .         x 

这些数字是排名前10位的卖家的产品ID。 即创建的列类似于xx.product_id的“柏林”。

#1楼 票数:1

以下内容将生成您要查找的内容的转置:

    select shop_id, 
    max(case when r = 1 then product_id else 0 end) as p_1,
    max(case when r = 2 then product_id else 0 end) as p_2,
    max(case when r = 3 then product_id else 0 end) as p_3,
    max(case when r = 4 then product_id else 0 end) as p_4,
    max(case when r = 5 then product_id else 0 end) as p_5,
    max(case when r = 6 then product_id else 0 end) as p_6,
    max(case when r = 7 then product_id else 0 end) as p_7,
    max(case when r = 8 then product_id else 0 end) as p_8,
    max(case when r = 9 then product_id else 0 end) as p_9,
    max(case when r = 10 then product_id else 0 end) as p_10
    from
    (
        select shop_id, product_id, sum(qty) as sales, 
        row_number() over (partition by shop_id order by sum(qty) desc) as r
        from orders
        group by shop_id, product_id
    )group by shop_id

要进行转置,您可以使用crosstab ,但这需要您事先知道商店的数量。 数据库通常不设计为具有列数未知的表。 一种可能的方法是创建一个类似于此处的函数。

#2楼 票数:0

我认为您只需要具有聚合的row_number()

select s.*, o.product_id
from shops s join
     (select shop_id, product_id, sum(qty) as qty,
             row_number() over (partition by shop_id order by sum(qty) desc) as rnk
      from orders o
      group by shop_id, product_id
     ) o
     on s.shop_id = o.shop_id
where rnk <= 10;

如果您想要有关产品的更多信息(而不是产品ID),则可以加入products表。

#3楼 票数:0

您可以看一下交叉表功能来创建数据透视表。 AFAIK无法创建动态列,但请尝试一下。

  ask by Peter translate from so

未解决问题?本站智能推荐:

1回复

如何定义与可变数量表的SQL关系

希望我的解释比标题更清楚。 我有一组文件。 每个文件包含可变数量的纸张/表格。 因此,我有一个名为files的表,带有一个fid。 为了简单起见,假设我们只有3种不同的形式,每种形式都包含自己的数据集。 所以我有3个表,FormA,FormB和FormC,分别具有主键Aid,Bid和
1回复

插入可变数量的列时正确格式化SQL查询

我正在使用psycopg2与PostgreSQL数据库进行交互。 我有一个函数,可以将表中的任意数量的列(从单列到所有列)插入到其中。 我的问题是:如何正确地、动态地构造这个查询? 目前我正在使用字符串格式和连接,我知道这绝对是最糟糕的方法。 考虑下面的代码,在这种情况下,我未知的列数(即dict中
1回复

在Golang中使用可变数量的命名参数执行SQL查询

所以我有这个PostgreSQL函数,它接受可变数量的命名参数并返回相应项的列表: 所以我可以运行像这样的多态查询: 在Golang我可以做类似的事情: 但是我怎么能这样做,但是有不同数量的read_user参数? 我正在使用pq驱动程序https://github.com/lib
1回复

检索具有不同条件的可变数量的子集

我有以下数据库: 我想为每个子集提取具有不同数量的居民的不同数量的子集。 当前,我对每个子集使用查询,例如,如果我需要两个子集,则可以使用以下两个查询: 和 结果可能如下所示: 和 我在Bash中加入了这两个结果,因此它们看起来确实是我想要的: 我想尽量减少数据库调用的
2回复

具有可变数量输入参数的函数

我正在 PostgreSQL 数据库中创建一个存储过程(函数),它根据输入更新表。 为了创建可变数量的参数函数,我创建了一个名为 mode 的额外输入参数,我用它来控制我在更新查询中使用的参数。 什么是最好的? 要创建一个函数update_site(<all the columns of ta
3回复

Postgres:简化SQL查询以摆脱子选择

我有一个events表,其中包含各种创建,完成和失败事件。 每个事件都有一个ID(表中的主键),还有一个“ entity_id”,它将多个事件链接在一起。 例如,创建请求然后完成请求时,我们将有两个事件: 请求#42已创建 请求#42已完成 在上面的示例中,42是请求的en
3回复

从带有postgres联接的子查询中选择歧义列

我有以下查询: 由于id0在sessions和clicked_products中都clicked_products ,因此出现了预期的错误: 列引用“ id0”不明确 但是,过去要解决此问题,我只需要指定一个表即可。 在这种情况下,我尝试: 但是,这导致以下错误: 表“
2回复

如何通过减少选择和联接来改进POSTGRES(SQL)查询?

我敢肯定,下面的代码是更好的语法方法,那就是,下面的代码足以实现所需的结果,但是我想使用适当的语法来做到这一点,并可能删除/减少不必要的联接和选择在同一张桌子上。 (即,多次使用rg.NAME和T.NAME字段)