ORACLE将连续或不连续月份合并sql怎么写,要求不通过存储过程实现 30
现有表中数据namemonthA2018-01A2018-02A2018-03A2018-06B2018-04B2018-05想得到的结果namehzA2018-01至2...
现有表中数据
name month
A 2018-01
A 2018-02
A 2018-03
A 2018-06
B 2018-04
B 2018-05
想得到的结果
name hz
A 2018-01至2018-03,2018-06
B 2018-04至2018-05 展开
name month
A 2018-01
A 2018-02
A 2018-03
A 2018-06
B 2018-04
B 2018-05
想得到的结果
name hz
A 2018-01至2018-03,2018-06
B 2018-04至2018-05 展开
4个回答
展开全部
你好的!
答案如下:
WITH t AS
(SELECT 'A' COL1, '2018-01' COL2 FROM dual UNION ALL
SELECT 'A', '2018-02' FROM dual UNION ALL
SELECT 'A', '2018-03' FROM dual UNION ALL
SELECT 'A', '2018-06' FROM dual UNION ALL
SELECT 'B', '2018-04' FROM dual UNION ALL
SELECT 'B', '2018-05' FROM dual)
SELECT col1,to_char(wm_concat(cat)) FROM (
SELECT DISTINCT col1,MIN(col2)OVER(PARTITION BY col1,flg1)||'至'||Max(col2)OVER(PARTITION BY col1,flg1) cat
FROM(
SELECT COL1,COL2,
CASE WHEN SUBSTR(COL2,6) - LAG(SUBSTR(COL2,6))OVER(PARTITION BY COL1 ORDER BY COL2 ASC) = 1
OR lead(SUBSTR(COL2,6))OVER(PARTITION BY COL1 ORDER BY COL2 ASC) - SUBSTR(COL2,6) = 1
THEN 1 ELSE 0 END FLG1 FROM T) WHERE FLG1 = 1
UNION ALL
SELECT DISTINCT col1,col2
FROM(
SELECT COL1,COL2,
CASE WHEN SUBSTR(COL2,6) - LAG(SUBSTR(COL2,6))OVER(PARTITION BY COL1 ORDER BY COL2 ASC) = 1
OR lead(SUBSTR(COL2,6))OVER(PARTITION BY COL1 ORDER BY COL2 ASC) - SUBSTR(COL2,6) = 1
THEN 1 ELSE 0 END FLG1 FROM T) WHERE FLG1 = 0)
GROUP BY col1
欢迎追加悬赏并采纳!以后有SQL 问题随便问!!!
展开全部
基础类
freelife258
06-08 13:26
等级 
8次回复
在存储过程中如何循环月份
想写个带参数的存储过程
如何将十二个月(JAN,FEB,MAR,-----,DEC)显示在表名中,效果是在每次循环过程中替换一个月的月字段,下例已经写好12次循环过程:
Create procedure proc_test @Year nvarchar(4)
as
go
declare @month int
set @month=1
declare @sql varchar(max)
while(@month<=12)
begin
set @sql = N'select * from Book_Account_'+@para+'_'+cast(@Month as varchar(10))
exec (@sql)
set @month=@month+1
end
基础类
freelife258
06-08 13:26
等级 
8次回复
在存储过程中如何循环月份
想写个带参数的存储过程
如何将十二个月(JAN,FEB,MAR,-----,DEC)显示在表名中,效果是在每次循环过程中替换一个月的月字段,下例已经写好12次循环过程:
Create procedure proc_test @Year nvarchar(4)
as
go
declare @month int
set @month=1
declare @sql varchar(max)
while(@month<=12)
begin
set @sql = N'select * from Book_Account_'+@para+'_'+cast(@Month as varchar(10))
exec (@sql)
set @month=@month+1
end
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你这样的要求,仅仅用sql语句,我感觉很不好实现,但是应该还是可以的。具体你可以研究下oracle的listagg和wmconcat函数,这两个函数可以实现分组聚合,然后你再在sql里用case when判断不同逻辑,应该可以实现。。。试试吧
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
楼上说得对啊
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询