Динамически NULL последние, а затем 2 последние строки на основе метки строки в SQL SERVER - PullRequest
0 голосов
/ 17 апреля 2020

Я занят созданием аналитических треугольников в R, однако мне нужно сначала создать базовые данные в SQL, чтобы сделать это, в основном он ожидает, что данные будут иметь нулевые данные при перемещении, поэтому, если 201912 - это ваш текущий YearMonth, то все строки должны быть нулевыми, кроме 1-й, если 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 ​​

Я должен увидеть нечто похожее на это: image

Это начнёт формировать эффект треугольника после перемещения в R

Любые идеи будут чрезвычайно полезны

1 Ответ

0 голосов
/ 21 апреля 2020

Получил работу, заменив корпус на следующий, будет работать:

CASE
WHEN DATEDIFF(month,CAST(CONCAT(CAST(round(a.origin,0) as INT),''01'')as date), GETDATE()) >= a.dev
THEN a.values
end "values"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...