SQL 如何在单独的列中显示订单的所有产品?

SQL How Do I Display All Products for an Order In Separate Columns?

我正在使用以下格式的 table

Order_ID Product_Name
1 A
1 B
2 B
2 C
3 A
3 C
3 B

我需要查询数据才能这样输出

Order_ID Product_1 Product_2 Product_3 Etc.
1 A B
2 B C
3 A C B

基本上,我需要将给定 order_id 的全部或至少几个 product_names 作为单独的列显示。我找到了一些建议使用自连接来执行此操作的答案,但是当我需要显示两个以上的产品时,这似乎并不实用。

这是在 BigQuery 中。

这种一般操作称为旋转。

根据您的数据库及其 SQL 方言,会有不同的最佳方法。例如,Snowflake 和 BigQuery 具有专门执行此操作的 PIVOT table 操作。

在 BigQuery 上:

with numbered as (
    select
        *,
        'Product_' || row_number() over (
            partition by OrderID order by ProductName asc
        ) as n
    from my_table
)
select
    *
from numbered pivot(
    max(ProductName) 
    for n in ('Product_1', 'Product_2', 'Product_3')
)
group by Order_ID

如果您的方言不支持此功能,但支持 window 功能,例如 row_number,那么您可以手动执行类似的操作以支持 pre-defined 数量的产品:

with numbered as (
    select *, row_number() over (partition by OrderID order by ProductName asc) as n
    from my_table
)
select
    OrderID,
    max(case when n = 1 then ProductName end) as Product_1,
    max(case when n = 2 then ProductName end) as Product_2,
    ...
from numbered
group by Order_ID

.. I need to show all, or at least several, product_names for a given order_id as separate columns

考虑以下

select * from (
  select *, row_number() over(partition by Order_ID) index
  from your_table
)
pivot (any_value(Product_Name) Product for index in (1,2,3,4,5))    

如果应用于您问题中的示例数据 - 输出为