Sql 不一致转置
给定一个表Sql 不一致转置,sql,oracle,Sql,Oracle,给定一个表a包含以下数据: +----------+-------+ | Supplier | buyer | +----------+-------+ | A | 1 | | A | 2 | | B | 3 | | B | 4 | | B | 5 | +----------+-------+ +----------+-------+ |供应商|买方| +----------+-----
a
包含以下数据:
+----------+-------+
| Supplier | buyer |
+----------+-------+
| A | 1 |
| A | 2 |
| B | 3 |
| B | 4 |
| B | 5 |
+----------+-------+
+----------+-------+
|供应商|买方|
+----------+-------+
|A | 1|
|A | 2|
|B | 3|
|B | 4|
|B | 5|
+----------+-------+
我的问题是,我可以转置第二列,使结果表如下所示:
+----------+--------+--------+--------+
| Supplier | buyer1 | buyer2 | buyer3 |
+----------+--------+--------+--------+
| A | 1 | 2 | |
| B | 3 | 4 | 5 |
+----------+--------+--------+--------+
+----------+--------+--------+--------+
|供应商|买方1 |买方2 |买方3|
+----------+--------+--------+--------+
|A | 1 | 2 ||
|B | 3 | 4 | 5|
+----------+--------+--------+--------+
假设最大买家数量为三个。您可以使用一个通用的表表达式在供应商中为每个买家下订单,然后只需按常规案例将其放入列中
WITH cte AS (
SELECT supplier, buyer,
ROW_NUMBER() OVER (PARTITION BY supplier ORDER BY buyer) rn
FROM Table1
)
SELECT supplier,
MAX(CASE WHEN rn=1 THEN buyer END) buyer1,
MAX(CASE WHEN rn=2 THEN buyer END) buyer2,
MAX(CASE WHEN rn=3 THEN buyer END) buyer3
FROM cte
GROUP BY supplier;
.您可以使用一个通用的表表达式在供应商中为每个买家下一个订单,然后只做一个常规的案例将它们放在列中
WITH cte AS (
SELECT supplier, buyer,
ROW_NUMBER() OVER (PARTITION BY supplier ORDER BY buyer) rn
FROM Table1
)
SELECT supplier,
MAX(CASE WHEN rn=1 THEN buyer END) buyer1,
MAX(CASE WHEN rn=2 THEN buyer END) buyer2,
MAX(CASE WHEN rn=3 THEN buyer END) buyer3
FROM cte
GROUP BY supplier;
< /P> < P>你可以考虑使用枢轴子句:
select *
from (
select supplier, buyer, row_number() over (partition by supplier order by buyer) as seq
from a
)
pivot (max(buyer) for seq in (1 as buyer1, 2 as buyer2, 3 as buyer3));
< /P> < P>你可以考虑使用枢轴子句:
select *
from (
select supplier, buyer, row_number() over (partition by supplier order by buyer) as seq
from a
)
pivot (max(buyer) for seq in (1 as buyer1, 2 as buyer2, 3 as buyer3));
.谢谢,但我应该提到我正在使用oracle 10g。Pivot从11g开始提供。谢谢,但我应该提到我正在使用oracle 10g。Pivot从11g开始提供。