根据 SQL SERVER 中的行标签,最后动态 NULL 最后 2 行

Dynamically NULL last then 2 last rows based on row label in SQL SERVER

我正忙于在 R 中创建分析三角形,但是我需要先在 SQL 中创建基础数据才能执行此操作,基本上它希望数据在移动时具有空数据,所以如果 201912 是你的当前 YearMonth 那么除了第一行之外的所有行都应该为空,如果 YearMonth 是 201911 那么除了前两行之外的所有行都应该为空等等。

我需要通过存储过程动态地执行此操作,并且将最后几行置为空有点困难。

我用以下方法对其进行了测试:

    DECLARE @Values as VARCHAR(MAX)
SELECT @Values =
COALESCE(@Values + ', ','')+'(' + QUOTENAME(B.COLUMN_NAME, '''')+','+QUOTENAME(B.column_name)+ ')'
FROM
   (select CAST(column_name as int) as column_name from INFORMATION_SCHEMA.COLUMNS where column_name != 'origin' and table_name = 'PIVOT'
   ) AS B
   order by b.COLUMN_NAME

DECLARE @SQL as VARCHAR(MAX)
SET @SQL = '
SELECT
a.origin,
a.dev,
CASE
WHEN a.origin = 201901
and a.dev = 16
then null
WHEN a.origin = 201902
and a.dev in (16, 15)
then null
WHEN a.origin = 201903
and a.dev in (16, 15, 14)
then null
WHEN a.origin = 201904
and a.dev in (16, 15, 14, 13)
then null
WHEN a.origin = 201905
and a.dev in (16, 15, 14, 13, 12)
then null
WHEN a.origin = 201906
and a.dev in (16, 15, 14, 13, 12, 11)
then null
WHEN a.origin = 201907
and a.dev in (16, 15, 14, 13, 12, 11, 10)
then null
WHEN a.origin = 201908
and a.dev in (16, 15, 14, 13, 12, 11, 10, 9)
then null
WHEN a.origin = 201909
and a.dev in (16, 15, 14, 13, 12, 11, 10, 9, 8)
then null
WHEN a.origin = 201910
and a.dev in (16, 15, 14, 13, 12, 11, 10, 9, 8, 7)
then null
WHEN a.origin = 201911
and a.dev in (16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6)
then null
WHEN a.origin = 201912
and a.dev in (16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5)
then null
WHEN a.origin = 202001
and a.dev in (16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4)
then null
WHEN a.origin = 202002
and a.dev in (16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3)
then null
WHEN a.origin = 202003
and a.dev in (16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2)
then null
WHEN a.origin = 202004
and a.dev in (16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1)
then null
else a.values
end "values"
from
(select 
origin,
CAST(dev as int) "dev",
SUM(x.values) OVER(PARTITION BY origin ORDER BY CAST(dev as int)
   ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) "values"
from PIVOT
CROSS APPLY
(
VALUES ' + @Values + '
) x(dev, values)
--order by origin, dev
)a
'
EXEC(@SQL)

Case 语句应该让您了解它应该做什么,我需要做的是动态设置 a.origin 和 a.dev 并根据@values 进行倒计时变量

我应该看到与此类似的内容:

一旦移入 R 就会开始形成三角形效果

任何想法都会非常有帮助

成功了,将大小写替换为以下大小写即可:

CASE
WHEN DATEDIFF(month,CAST(CONCAT(CAST(round(a.origin,0) as INT),''01'')as date), GETDATE()) >= a.dev
THEN a.values
end "values"