Обновить таблицу на основе ColumnName другой таблицы, в которой условие - PullRequest
0 голосов
/ 05 мая 2020

У меня есть данные в таблице базы данных Toad SQL. Допустим, имя таблицы - tblSample.

ID     NAME   COVERMONTH  EFFECTIVEDATE  TERMDATE  PAIDAMOUNT  EARNEDAMOUNT
1546871 SAMPLE1    202001   1-Aug-14     31-Dec-99       5122.12     5111.02  
1065418 SAMPLE2    202001   1-Jan-15     31-Dec-99           0           0
1546871 SAMPLE1    202002   1-Aug-14     31-Dec-99        5122.12     5111.02  
1065418 SAMPLE2    202002   1-Jan-15     31-Dec-99        3211.21     3211.21
1546822 SAMPLE3    202001   1-Jan-15     31-Dec-99        5122.12     5111.02  
1546822 SAMPLE3    202002   1-Jan-15     31-Dec-99        3211.21     3211.21

Количество идентификаторов будет динамическим c. Я изменил приведенную выше таблицу на один раз, как показано ниже, в соответствии с требованиями. Получил соблазнительный результат.

 ID     NAME      EFFECTIVEDATE    TERMDATE    202001    202002   202003 ----- 201803
1546871 SAMPLE1   1-Aug-14      31-Dec-99  
1065418 SAMPLE2   1-Jan-15      31-Dec-99     
1546822 SAMPLE3   1-Jan-15      31-Dec-99      

Мне нужно обновить эту временную таблицу с помощью PAIDAMOUNT

ID    NAME    EFFECTIVEDATE    TERMDATE    202001    202002   202003 --- -------- 201803
1546871 SAMPLE1   1-Aug-14      31-Dec-99  5122.12   5111.02   ------ ------
1065418 SAMPLE2   1-Jan-15      31-Dec-99      0     3211.21   ------ ------
1065418 SAMPLE3   1-Jan-15      31-Dec-99  5122.12   3211.21   ------ ------

Мне нужно обновить соблазнительное на основе ID и COVERMONTH в условии where, но COVERMONTH - соблазнительные столбцы.

Ниже мой запрос

DECLARE @ID varchar(50)
DECLARE MY_CURSOR CURSOR
LOCAL STATIC READ_ONLY FORWARD_ONLY
FOR
SELECT ID FROM temptable

OPEN MY_CURSOR
FETCH NEXT FROM MY_CURSOR INTO @Id
WHILE @@FETCH_STATUS=0

BEGIN
DECLARE @Counter1 int
SET @Counter1 = 1
DECLARE @FinalCounter int
SET @FinalCounter = (Select Count(*) FROM sampletable)
DECLARE @CoverMonth varchar(20)
DECLARE @UpdateSql1 varchar(200)

WHILE (@Counter1 <= @FinalCounter)
BEGIN
SET @CoverMonth = (SELECT COVERMONTH FROM sampletable where ID=@Id)
SET @UpdateSql1 = 'UPDATE temptable' + ' SET [' + @CoverMonth + ' ' = 'PAIDAMOUNT' WHERE ID=@Id and @CoverMonth= 'column name of temptable'.

EXEC(@UpdateSql1)
SET @Counter1=@Counter1+1
END
END

Мне не удалось выполнить запрос. Но пришла идея, что Step1-> Итерировать по таблице выборок Step2-> Итерировать по соблазнительному Step3-> Обновить запрос с sampletable.ID = temptable.ID и sampletable.COVERMONTH = temptable. [ColumnName]

Как Могу ли я перебрать COVERMONTH в таблице выборок, чтобы получить все месяцы покрытия для определенного идентификатора и обновить значения

Любая помощь приветствуется.

Ответы [ 2 ]

0 голосов
/ 05 мая 2020

а что с этим?

    DECLARE @covermonths NVARCHAR(100) = (
        SELECT CONCAT(', [', [COVERMONTH], ']')
        FROM dbo.tblSample
        GROUP BY [COVERMONTH]
        FOR XML PATH('')
    );

    SET @covermonths = SUBSTRING(@covermonths, 2, LEN(@covermonths));

    DECLARE @statement NVARCHAR(4000) = CONCAT(N'
        SELECT [ID], [NAME], [EFFECTIVEDATE], [TERMDATE], ', @covermonths, N'
        FROM (
            SELECT [ID], [NAME], [COVERMONTH], [EFFECTIVEDATE], [TERMDATE], [PAIDAMOUNT]
            FROM dbo.tblSample
        ) A
        PIVOT (
            SUM([PAIDAMOUNT])
            FOR [COVERMONTH] IN (', @covermonths, N')
        ) B
    ');

    EXEC (@statement);
0 голосов
/ 05 мая 2020

Почему вы просто не используете PIVOT? Попробуйте это:

    SELECT [ID], [NAME], [EFFECTIVEDATE], [TERMDATE], [202001], [202002]
    FROM (
        SELECT [ID], [NAME], [COVERMONTH], [EFFECTIVEDATE], [TERMDATE], [PAIDAMOUNT]
        FROM dbo.tblSample
    ) A
    PIVOT (
        SUM([PAIDAMOUNT])
        FOR [COVERMONTH] IN ([202001], [202002])
    ) B

PS: маленькая подсказка ... забудьте о курсорах !!

...