oracle多行合并成一行,并且行内不同值组成新列。显示在同一行

时间:2022-09-17 10:28:21
如图 假如表中存在前四行数据,将要合并成两行数据,并且将相同字段的不同值 组成新的列来显示数据(如图,后5列的值不同)该如何实现。
oracle多行合并成一行,并且行内不同值组成新列。显示在同一行

9 个解决方案

#1


预期结果 是什么样的?

#2


引用 1 楼 wmxcn2000 的回复:
预期结果 是什么样的?

station_id , device_id , box_type_name ,box_id ,tick_num1 ,ticknum2 ,oper_type_name1,oper_type_name2  ......
这样,很难理解我的问题吗

#3


以前4列为基准 合并相同的数据行,后面5列 的不同值 分别各增加一列来表示数据,最后的效果是 得到14列的值,
也就是说在同一地点同一台设备上做了两次操作,把这两次操作写在一行里。

#4


引用 3 楼 w1016373004 的回复:
以前4列为基准 合并相同的数据行,后面5列 的不同值 分别各增加一列来表示数据,最后的效果是 得到14列的值,
也就是说在同一地点同一台设备上做了两次操作,把这两次操作写在一行里。


前4列相同的一定两条吗,只有一条呢,有N条呢
这两条的后5列,弄成: 列1(1) 列1(2) 。。。 列5(1) 列5(2),哪条在前没有顺序要求

#5


引用 4 楼 Diza1986 的回复:
Quote: 引用 3 楼 w1016373004 的回复:

以前4列为基准 合并相同的数据行,后面5列 的不同值 分别各增加一列来表示数据,最后的效果是 得到14列的值,
也就是说在同一地点同一台设备上做了两次操作,把这两次操作写在一行里。


前4列相同的一定两条吗,只有一条呢,有N条呢
这两条的后5列,弄成: 列1(1) 列1(2) 。。。 列5(1) 列5(2),哪条在前没有顺序要求


目前假设前4列值存在两条重复数据,后面的列按照 卸下和安装 的类型先后显示, 
 列1(1) 列1(2) 。。。 列5(1) 列5(2)
 列1 安装的数量(1) 列1 卸下的数量(2) 。。。 列5安装的时间(1) 列5卸下的时间(2)

#6



SELECT R1. station_id,R1.device_id ,R1.box_type_name ,R1.box_id,R1.tick_num1,R2.tick_num1......
(SELECT * FROM (
SELECT T1.*,ROW_NUMBER()OVER(PATITION BY station_id , device_id , box_type_name ,box_id )  RN FROM T1) WHERE RN=1) R1 JOIN 
SELECT * FROM (
SELECT T1.*,ROW_NUMBER()OVER(PATITION BY station_id , device_id , box_type_name ,box_id )  RN FROM T1) WHERE RN=2) R2
ON ......

#8



-- 你这太长了,写了个简单的例子
WITH a AS
(SELECT 1 c1, 'a' c2, 1 c3 FROM dual
UNION ALL
SELECT 1 c1, 'b' c2, 2 c3 FROM dual
UNION ALL
SELECT 2 c1, 'c' c2, 1 c3 FROM dual
UNION ALL
SELECT 2 c1, 'd' c2, 3 c3 FROM dual)
SELECT 
c1,
max(CASE WHEN rnum = 1 THEN c2 END ) c2_1,
max(CASE WHEN rnum = 2 THEN c2 END ) c2_2,
max(CASE WHEN rnum = 1 THEN c3 END ) c3_1,
max(CASE WHEN rnum = 2 THEN c3 END ) c3_2  FROM 
(
SELECT a.*, row_number() OVER(PARTITION BY c1 ORDER BY c2) rnum FROM a
) a1
GROUP BY c1;

        C1 C2_1 C2_2       C3_1       C3_2
---------- ---- ---- ---------- ----------
         1 a    b             1          2
         2 c    d             1          3

[/code]

#9


引用 8 楼 u012557814 的回复:

-- 你这太长了,写了个简单的例子
WITH a AS
(SELECT 1 c1, 'a' c2, 1 c3 FROM dual
UNION ALL
SELECT 1 c1, 'b' c2, 2 c3 FROM dual
UNION ALL
SELECT 2 c1, 'c' c2, 1 c3 FROM dual
UNION ALL
SELECT 2 c1, 'd' c2, 3 c3 FROM dual)
SELECT 
c1,
max(CASE WHEN rnum = 1 THEN c2 END ) c2_1,
max(CASE WHEN rnum = 2 THEN c2 END ) c2_2,
max(CASE WHEN rnum = 1 THEN c3 END ) c3_1,
max(CASE WHEN rnum = 2 THEN c3 END ) c3_2  FROM 
(
SELECT a.*, row_number() OVER(PARTITION BY c1 ORDER BY c2) rnum FROM a
) a1
GROUP BY c1;

        C1 C2_1 C2_2       C3_1       C3_2
---------- ---- ---- ---------- ----------
         1 a    b             1          2
         2 c    d             1          3

[/code]

你这个 好像不行吧,

#1


预期结果 是什么样的?

#2


引用 1 楼 wmxcn2000 的回复:
预期结果 是什么样的?

station_id , device_id , box_type_name ,box_id ,tick_num1 ,ticknum2 ,oper_type_name1,oper_type_name2  ......
这样,很难理解我的问题吗

#3


以前4列为基准 合并相同的数据行,后面5列 的不同值 分别各增加一列来表示数据,最后的效果是 得到14列的值,
也就是说在同一地点同一台设备上做了两次操作,把这两次操作写在一行里。

#4


引用 3 楼 w1016373004 的回复:
以前4列为基准 合并相同的数据行,后面5列 的不同值 分别各增加一列来表示数据,最后的效果是 得到14列的值,
也就是说在同一地点同一台设备上做了两次操作,把这两次操作写在一行里。


前4列相同的一定两条吗,只有一条呢,有N条呢
这两条的后5列,弄成: 列1(1) 列1(2) 。。。 列5(1) 列5(2),哪条在前没有顺序要求

#5


引用 4 楼 Diza1986 的回复:
Quote: 引用 3 楼 w1016373004 的回复:

以前4列为基准 合并相同的数据行,后面5列 的不同值 分别各增加一列来表示数据,最后的效果是 得到14列的值,
也就是说在同一地点同一台设备上做了两次操作,把这两次操作写在一行里。


前4列相同的一定两条吗,只有一条呢,有N条呢
这两条的后5列,弄成: 列1(1) 列1(2) 。。。 列5(1) 列5(2),哪条在前没有顺序要求


目前假设前4列值存在两条重复数据,后面的列按照 卸下和安装 的类型先后显示, 
 列1(1) 列1(2) 。。。 列5(1) 列5(2)
 列1 安装的数量(1) 列1 卸下的数量(2) 。。。 列5安装的时间(1) 列5卸下的时间(2)

#6



SELECT R1. station_id,R1.device_id ,R1.box_type_name ,R1.box_id,R1.tick_num1,R2.tick_num1......
(SELECT * FROM (
SELECT T1.*,ROW_NUMBER()OVER(PATITION BY station_id , device_id , box_type_name ,box_id )  RN FROM T1) WHERE RN=1) R1 JOIN 
SELECT * FROM (
SELECT T1.*,ROW_NUMBER()OVER(PATITION BY station_id , device_id , box_type_name ,box_id )  RN FROM T1) WHERE RN=2) R2
ON ......

#7


#8



-- 你这太长了,写了个简单的例子
WITH a AS
(SELECT 1 c1, 'a' c2, 1 c3 FROM dual
UNION ALL
SELECT 1 c1, 'b' c2, 2 c3 FROM dual
UNION ALL
SELECT 2 c1, 'c' c2, 1 c3 FROM dual
UNION ALL
SELECT 2 c1, 'd' c2, 3 c3 FROM dual)
SELECT 
c1,
max(CASE WHEN rnum = 1 THEN c2 END ) c2_1,
max(CASE WHEN rnum = 2 THEN c2 END ) c2_2,
max(CASE WHEN rnum = 1 THEN c3 END ) c3_1,
max(CASE WHEN rnum = 2 THEN c3 END ) c3_2  FROM 
(
SELECT a.*, row_number() OVER(PARTITION BY c1 ORDER BY c2) rnum FROM a
) a1
GROUP BY c1;

        C1 C2_1 C2_2       C3_1       C3_2
---------- ---- ---- ---------- ----------
         1 a    b             1          2
         2 c    d             1          3

[/code]

#9


引用 8 楼 u012557814 的回复:

-- 你这太长了,写了个简单的例子
WITH a AS
(SELECT 1 c1, 'a' c2, 1 c3 FROM dual
UNION ALL
SELECT 1 c1, 'b' c2, 2 c3 FROM dual
UNION ALL
SELECT 2 c1, 'c' c2, 1 c3 FROM dual
UNION ALL
SELECT 2 c1, 'd' c2, 3 c3 FROM dual)
SELECT 
c1,
max(CASE WHEN rnum = 1 THEN c2 END ) c2_1,
max(CASE WHEN rnum = 2 THEN c2 END ) c2_2,
max(CASE WHEN rnum = 1 THEN c3 END ) c3_1,
max(CASE WHEN rnum = 2 THEN c3 END ) c3_2  FROM 
(
SELECT a.*, row_number() OVER(PARTITION BY c1 ORDER BY c2) rnum FROM a
) a1
GROUP BY c1;

        C1 C2_1 C2_2       C3_1       C3_2
---------- ---- ---- ---------- ----------
         1 a    b             1          2
         2 c    d             1          3

[/code]

你这个 好像不行吧,