我的表:
CREATE TABLE tbl(
id int,
fiber varchar2(40),
pct int);
insert into tbl (id, fiber, pct) values ('1','Cotton','60');
insert into tbl (id, fiber, pct) values ('1','Poly','40');
insert into tbl (id, fiber, pct) values ('2','Elastane','30');
insert into tbl (id, fiber, pct) values ('2','Cotton','50');
insert into tbl (id, fiber, pct) values ('2','Spandex','20');
我尝试用PIVOT编写一个SQL查询,将这些内容放入列中,因此我的SQL结果如下所示:
ID Fiber1 Pct1 Fiber2 Pct2 Fiber3 Pct3
-------------------------------------------------
1 Cotton 60 Poly 40
2 Elastane 30 Cotton 50 Spandex 20
我以前从未使用过Pivot。我找到的所有示例都在Pivot查询中显式列出了列。问题是,fiber列有几十个不同的值,因此在查询中对它们进行硬编码是不切实际的。
我很好奇,是否有一种方法可以像这样使列通用,并将数据放入行中。
谢谢大家!
2条答案
按热度按时间jjhzyzn01#
使用
ROW_NUMBER()
解析函数对每个id
和PIVOT
的行进行编号:或者,使用
ROW_NUMBER()
解析函数和条件聚合:对于样本数据,两者都输出:
| ID|纤维1|PCT1|纤维2|PCT2|FIBER3|PCT3|
| --------------|--------------|--------------|--------------|--------------|--------------|--------------|
| 1|棉花|六十|聚乙烯|四十|联系我们|联系我们|
| 二|棉花|五十|弹性纤维|三十|氨纶|二十|
fiddle
8ftvxx2r2#
使用
row_number()
为每一行生成行号,然后使用group by
、max()
和case
子句进行条件聚合,如下所示:如果您对按行级别排序数据感兴趣,则可以使用
order by fiber
或其他列Demo here