ORACLE将连续或不连续月份合并sql怎么写,要求不通过存储过程实现

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ORACLE将连续或不连续月份合并sql怎么写,要求不通过存储过程实现相关的知识,希望对你有一定的参考价值。

现有表中数据
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

你好的!

答案如下:

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 问题随便问!!!

参考技术A 
基础类
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
参考技术B 你这样的要求,仅仅用sql语句,我感觉很不好实现,但是应该还是可以的。具体你可以研究下oracle的listagg和wmconcat函数,这两个函数可以实现分组聚合,然后你再在sql里用case when判断不同逻辑,应该可以实现。。。试试吧 参考技术C 楼上说得对啊

sql server获取连续年份月份日

if exists(select 1 from sysobjects where type=TF and name=ATPublic_TF_GetSummaryDate)
    drop function ATPublic_TF_GetSummaryDate
go
create function ATPublic_TF_GetSummaryDate
(
    @calltype varchar(1)=‘‘,    --0:年 1:月    1:日
    @startdate DATE,            --开始日期
    @enddate DATE                --结束日期
) 
 /*** 
    Author: 
    Create date: 2018-01-18
    Description: 循环返回日期   
    Example: 

***/
RETURNS @retDateValue TABLE (datevalue varchar(32))                                                                               
as    
begin
    if @calltype=0
    begin
        insert into @retDateValue(datevalue)
        select substring(convert(varchar(32),DATEADD(YEAR,number,@startdate),21),1,4) as yearvalue                                                                              
        from master..spt_values WHERE TYPE = P AND DATEADD(YEAR,number,@startdate) <= @enddate                
    end
    else if @calltype=1
    begin
        insert into @retDateValue(datevalue)
        select substring(convert(varchar(32),DATEADD(MONTH,number,@startdate),21),1,7) as yearvalue                                                                              
        from master..spt_values WHERE TYPE = P AND DATEADD(MONTH,number,@startdate) < @enddate                
    end
    else if @calltype=2
    begin
        insert into @retDateValue(datevalue)
        select convert(varchar(32),DATEADD(DAY,number,@startdate),21)+ 00:00:00 as yearvalue                                                                              
        from master..spt_values WHERE TYPE = P AND DATEADD(DAY,number,@startdate) < @enddate                
    end
    return
end
                                                                        
go

调用示例:

declare @beginDate varchar(32)=‘‘, @endDate varchar(32)=‘‘,@datebefore datetime
select @beginDate=2017-01-01,@endDate=2017-05-31
select @datebefore=CONVERT(datetime,@beginDate)
select datevalue   from ATPublic_TF_GetSummaryDate(0,@beginDate,@endDate)
select datevalue from ATPublic_TF_GetSummaryDate(1,@beginDate,dateadd(YEAR,1,@datebefore))
select datevalue from ATPublic_TF_GetSummaryDate(1,@beginDate,dateadd(MONTH,1,@datebefore))
select datevalue from ATPublic_TF_GetSummaryDate(2,@beginDate,dateadd(MONTH,1,@datebefore))

 

以上是关于ORACLE将连续或不连续月份合并sql怎么写,要求不通过存储过程实现的主要内容,如果未能解决你的问题,请参考以下文章

sql 语句:一个字段,连续几天值大于0,获得天数 怎么解决的?请教

sql 语句:一个字段,连续几天值大于0,获得天数 怎么解决的?请教

oracle 怎么得到一个表中连续ID中断开的ID

SQL 判断是不是已经过了多个连续的月份

Oracle数据库建表语句连续执行的问题

oracle中一张表的字段数值应该是连续的,怎么找出中间中断的数值