【问题标题】:How to display multiple rows based row difference data In SQL?如何在 SQL 中显示基于多行的行差异数据?
【发布时间】:2021-11-30 07:27:17
【问题描述】:

我有一张如下表:

EmpID   FromYM  ToYM    EmpYl      EmpX1 
-----    ------  -----  ------     ----------
1001    202101  202101  20210103   20210103
1001    202102  202103  20210103   20210103

我想根据上面的数据拆分这个数据。

如果 FromYm(Means yearmonth) 和 ToYM(Means yearmonth) 差为二,则结果为两行:

示例结果:

EmpID   FromYM  ToYM    EmpYl     DiffNoCount
------  ------  ----    -----     ------
1001    202101  202101  20210103  1 
1001    202102  202103  20210103  1 
1001    202102  202103  20210103  2

试用过的代码

IF OBJECT_ID(N'tempdb..#rawdata1') IS NOT NULL
BEGIN
DROP TABLE #rawdata1
END
IF OBJECT_ID(N'tempdb..#rawdata2') IS NOT NULL
BEGIN
DROP TABLE #rawdata2
END


go

declare @Max as int
declare @Kount as int
Set @Kount = 1
SELECT row_number() Over (order by EmpID) as row,EmpID
,FromYM
,ToYM
, EmpYl
,EmpX1
into #rawdata1
FROM [dbo].[ASAAValue1]
order by EmpID
set @Max = (Select Max(FromYM) from #rawdata1)

Create Table #Rawdata2
(
[Row] int,
Rolling int,
RollingAvg decimal(15,2),
RollingFinal int
)
while (@kount < @max)
Begin
Insert into #rawdata2
select @Kount as Row , FromYM as Rolling

, ToYM as RollingAvg,

   Case When  Convert(int,Convert(nvarchar(6),EmpYl))>=FromYM
    Then  <br>
     FromYM   <br>
    Else<br>
      FromYM+1  <br>
     End <br>
 
from #rawdata1<br>
where row between @Kount - 12  and @Kount  <br>
set @Kount = @Kount + 1
end
select rd1.row,
rd1.EmpID,Rd1.FromYM,Rd1.ToYM,Rd1.EmpYl, rd2.RollingFinal as Final from #rawdata2 rd2
inner join #rawdata1 rd1
on rd1.row = rd2.row

【问题讨论】:

  • 根据问题指南,请展示您的尝试并告诉我们您发现了什么(在本网站或其他地方)以及为什么它不能满足您的需求。
  • @venkat 您的示例表定义不包含您在下面的查询中使用的 EmpX1 列

标签: sql sql-server tsql


【解决方案1】:

您可以使用递归 cte 来做到这一点:

with data as (
  select '202101' as f, '202101' as t union all
  select '202102' as f, '202103' as t
),
rcte as (
  select *, 1 as n from data
  union all
  select f, t, n + 1
  from rcte
  where n <= datediff(month, convert(date, f + '01', 112), convert(date, t + '01', 112))
)
select * from rcte

你可以在这个db<>fiddle上测试

【讨论】:

    猜你喜欢
    • 2013-01-21
    • 2017-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多