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))
如果应用于您问题中的示例数据 - 输出为
我正在使用以下格式的 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))
如果应用于您问题中的示例数据 - 输出为