急求---这个sql语句如何写?

weihai27 2014-12-27 09:54:57


如何用SQL语句 将左面的数据 统计成右面表格的数据?
数据库为ORACLE11G

求各位大神指教。
...全文
299 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_25043719 2015-01-04
  • 打赏
  • 举报
回复
真是高手啊! 妙啊
bw555 2014-12-31
  • 打赏
  • 举报
回复
引用 6 楼 Iversonbi 的回复:
[quote=引用 4 楼 wildwave 的回复:] select a, wm_concat(b_range) from (select a, min(b) || '-' || max(b) b_range from (select a, b, dense_rank() over(partition by a order by b) dr from t) group by a, dr - b) group by a
怎么在mysql 中无法运行这sql[/quote] mysql中没分析函数的用法吧,想在mysql实现此效果,需要表自连接实现
Iversonbi 2014-12-31
  • 打赏
  • 举报
回复
引用 4 楼 wildwave 的回复:
select a, wm_concat(b_range) from (select a, min(b) || '-' || max(b) b_range from (select a, b, dense_rank() over(partition by a order by b) dr from t) group by a, dr - b) group by a
怎么在mysql 中无法运行这sql
tracy敬 2014-12-30
  • 打赏
  • 举报
回复
引用 2 楼 bw555 的回复:
按你给定的数据测试通过,到实际环境执行下试试吧
SQL> WITH Table1 AS(
  2  select 'A' A,1 B FROM DUAL UNION ALL
  3  select 'A' A,2 B FROM DUAL UNION ALL
  4  select 'A' A,3 B FROM DUAL UNION ALL
  5  select 'A' A,5 B FROM DUAL UNION ALL
  6  select 'A' A,6 B FROM DUAL UNION ALL
  7  select 'B' A,1 B FROM DUAL UNION ALL
  8  select 'B' A,2 B FROM DUAL UNION ALL
  9  select 'C' A,1 B FROM DUAL UNION ALL
 10  select 'C' A,2 B FROM DUAL UNION ALL
 11  select 'C' A,3 B FROM DUAL UNION ALL
 12  select 'C' A,4 B FROM DUAL UNION ALL
 13  select 'C' A,8 B FROM DUAL UNION ALL
 14  select 'C' A,9 B FROM DUAL UNION ALL
 15  select 'C' A,10 B FROM DUAL
 16  ),T AS (
 17  SELECT A,B,LAG(B,1,B-2)OVER(PARTITION BY A ORDER BY B) PRE
 18  FROM Table1
 19  ),T1 AS (
 20  SELECT A,CONNECT_BY_ROOT(B)||'-'||B B FROM T
 21  WHERE CONNECT_BY_ISLEAF=1
 22  START WITH B-PRE>1
 23  CONNECT BY PRIOR A=A AND PRIOR B+1=B
 24  )
 25  SELECT A,TO_CHAR(WMSYS.WM_CONCAT(B)) B
 26  FROM T1 GROUP BY A;

A
-
B
--------------------------------------------------------------------------------
A
1-3,5-6

B
1-2

C
1-4,8-10
大牛
bw555 2014-12-30
  • 打赏
  • 举报
回复
引用 4 楼 wildwave 的回复:
select a, wm_concat(b_range) from (select a, min(b) || '-' || max(b) b_range from (select a, b, dense_rank() over(partition by a order by b) dr from t) group by a, dr - b) group by a
妙的很啊
小灰狼W 2014-12-30
  • 打赏
  • 举报
回复
select a, wm_concat(b_range) from (select a, min(b) || '-' || max(b) b_range from (select a, b, dense_rank() over(partition by a order by b) dr from t) group by a, dr - b) group by a
bw555 2014-12-27
  • 打赏
  • 举报
回复
按你给定的数据测试通过,到实际环境执行下试试吧
SQL> WITH Table1 AS(
  2  select 'A' A,1 B FROM DUAL UNION ALL
  3  select 'A' A,2 B FROM DUAL UNION ALL
  4  select 'A' A,3 B FROM DUAL UNION ALL
  5  select 'A' A,5 B FROM DUAL UNION ALL
  6  select 'A' A,6 B FROM DUAL UNION ALL
  7  select 'B' A,1 B FROM DUAL UNION ALL
  8  select 'B' A,2 B FROM DUAL UNION ALL
  9  select 'C' A,1 B FROM DUAL UNION ALL
 10  select 'C' A,2 B FROM DUAL UNION ALL
 11  select 'C' A,3 B FROM DUAL UNION ALL
 12  select 'C' A,4 B FROM DUAL UNION ALL
 13  select 'C' A,8 B FROM DUAL UNION ALL
 14  select 'C' A,9 B FROM DUAL UNION ALL
 15  select 'C' A,10 B FROM DUAL
 16  ),T AS (
 17  SELECT A,B,LAG(B,1,B-2)OVER(PARTITION BY A ORDER BY B) PRE
 18  FROM Table1
 19  ),T1 AS (
 20  SELECT A,CONNECT_BY_ROOT(B)||'-'||B B FROM T
 21  WHERE CONNECT_BY_ISLEAF=1
 22  START WITH B-PRE>1
 23  CONNECT BY PRIOR A=A AND PRIOR B+1=B
 24  )
 25  SELECT A,TO_CHAR(WMSYS.WM_CONCAT(B)) B
 26  FROM T1 GROUP BY A;

A
-
B
--------------------------------------------------------------------------------
A
1-3,5-6

B
1-2

C
1-4,8-10
bw555 2014-12-27
  • 打赏
  • 举报
回复
很有意思的需求,应该是利用connect by start with的树形查询能实现,一会给你写下吧

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧