Добавление двух динамических столбцов в таблицу с помощью хранимой процедуры, и эти столбцы должны иметь данные на основе условия - PullRequest
0 голосов
/ 19 июня 2019

Я пытаюсь добавить две динамические колонки HeaderText и IsShowHeader в мою таблицу с помощью хранимой процедуры.

В первом столбце первая строка должна иметь текст Header1, а после 8 строк текст должен быть Header2, затем снова после 8 строк текст должен быть Header3 и т. Д.

Во втором столбце значение должно быть 1, а в следующих 8 строках должно быть 0, значение в 9-й строке должно быть снова 1, затем в следующих 8 строках должно быть 0, как это ...

ALTER PROCEDURE [dbo].[SkipRow]
AS
BEGIN
    SELECT   RID
            ,FirstName
            ,LastName                   
            ,(CASE WHEN X.[Row#]%9=0 And [X].[Row#]=0 THEN 1 ELSE 
                           0 END)As IsShowHeader        
            ,(COUNT(*) OVER ()) as TotalRows FROM
    (
    SELECT 
    *,ROW_NUMBER() OVER(ORDER BY RID) AS [Row#] 
    FROM Mytable1 WITH(NOLOCK)
    )X 
End

Выход:

           HeaderText                IsShowHeader
1            Header1                    1
2             Null                      0
3             Null                      0
4             Null                      0
5             Null                      0
6             Null                      0
7             Null                      0
8             Null                      0
9             Null                      0
10           Header2                    1
11            Null                      0
12            Null                      0
13            Null                      0
14            Null                      0
15            Null                      0
16            Null                      0
17            Null                      0
18            Null                      0
19           Header3                    1

Ответы [ 2 ]

0 голосов
/ 19 июня 2019

Вы можете попробовать это:

SELECT M.id,
       M.HeaderText,
       CASE WHEN M.HeaderText IS NOT NULL THEN 1 ELSE 0 END AS IsShowHeader
FROM
(
    SELECT P.id,
           CASE
               WHEN P.HeaderText IS NOT NULL THEN
                   P.HeaderText + CAST(P.IndexNumber AS VARCHAR(10))
               ELSE
                   NULL
           END AS HeaderText
    FROM
    (
        SELECT K.id,
               HeaderText,
               COUNT(K.HeaderText) OVER (ORDER BY id ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS IndexNumber
        FROM
        (
            SELECT id,
                   CASE
                       WHEN (id - 1) % 9 = 0 THEN 'Header' ELSE NULL
                   END AS HeaderText
            FROM dbo.test
        ) AS K
    ) AS P
) AS M;

Я проиллюстрировал сценарий шаг за шагом, однако вы можете переписать его простым способом, например, ответ, который выложил @ Squirrel .

0 голосов
/ 19 июня 2019

у вас уже есть [Row#], используйте оператор modulus %, чтобы получить каждые 9 строк

HeaderText   = case when ([Row#] - 1) % 9 = 0 
                    then 'Header' + convert(varchar(10), ([Row#] - 1) / 9 + 1)
                    end,
IsShowHeader = case when ([Row#] - 1) % 9 = 0 
                    then 1 else 0 end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...