如何在 SQL 中不使用 PIVOT 函数进行透视?

问题描述 投票:0回答:2

我想在不使用任何

PIVOT
函数的情况下对表进行透视,而仅使用纯 SQL(例如 PostgreSQL 语法)。

以这个数据集为例:

Order |   Element | Value |
---------------------------
1     | Item      | Bread |
1     | Quantity  |  3    |
1     | TotalCost |  3,30 |
2     | Item      | Pizza |
2     | Quantity  |  2    |
2     | TotalCost |  10   |
3     | Item      | Pasta |
3     | Quantity  |  5    |
3     | TotalCost |  2,50 |

我希望以

Order
列为中心,并有类似的东西:

Order | Item | Quantity | TotalCost |
-------------------------------------
1     | Bread |    3    |    3,30   |
2     | Pizza |    2    |    10     |
3     | Pasta |    5    |    2,50   |

如何在不使用任何枢轴函数的情况下再次实现这一目标?

sql postgresql pivot
2个回答
2
投票

解决方案A

使用

CASE WHEN
语句:

SELECT Order, 
       MAX(CASE WHEN Element = 'Item' THEN Value END) AS Item, 
       MAX(CASE WHEN Element = 'Quantity' THEN Value END) AS Quantity, 
       MAX(CASE WHEN Element = 'TotalCost' THEN Value END) AS TotalCost
FROM MyTable
GROUP BY 1

解决方案B

使用self

LEFT JOIN
s:

SELECT A.Order, A.Item, B.Quantity, C.TotalCost
FROM
    (SELECT Order, Value as Item
    FROM MyTable
    WHERE Element = 'Item') as A
    LEFT JOIN
    (SELECT Order, Value as Quantity
    FROM MyTable
    WHERE Element = 'Quantity') as B ON A.Order = B.Order
    LEFT JOIN
    (SELECT Order, Value as TotalCost
    FROM MyTable
    WHERE Element = 'TotalCost') as C ON B.Order = C.Order

后者可能没有那么高效,但在某些用例中可能会很有用。


1
投票

在 Postgres 中,您可以使用

FILTER
:

SELECT Order, 
       MAX(Value) FILTER (WHERE Element = 'Item') AS Item, 
       MAX(Value) FILTER (WHERE Element = 'Quantity') AS Quantity, 
       MAX(Value) FILTER (WHERE Element = 'TotalCost') AS TotalCost
FROM MyTable
GROUP BY 1;

请注意

ORDER
是一个 SQL 关键字,因此它对于列名来说是一个糟糕的选择。

© www.soinside.com 2019 - 2024. All rights reserved.