Преобразовать указанные c строки в заголовок и указанные c строки в значения заголовков SQL Сервер - PullRequest
0 голосов
/ 30 апреля 2020

У меня есть данные ниже в жабе 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

В приведенных выше данных у меня есть данные для 2 идентификаторов проекта. В действительности, число идентификаторов проекта будет динамическим c

ПРИМЕЧАНИЕ. COVERMONTH будет динамическим c значениями. Они меняются месяц за месяцем.

Требуемый вывод показан ниже

ID    NAME    EFFECTIVEDATE    TERMDATE    202001    202002   202003 --- all the rows are completed
1546871 SAMPLE1   1-Aug-14      31-Dec-99  5122.12   5111.02   5122.12 ------
1065418 SAMPLE2   1-Jan-15      31-Dec-99      0     3211.21   3012.12 ------

Проще говоря, мне нужно сделать COVERMONTH в качестве заголовка столбца и EARNEDAMOUNT в качестве значения строки для определенного идентификатора.

В примере таблицы идентификаторов NAME, EFFECTIVEDATE, TERMDATE одинаковы для определенного идентификатора, но PAIDAMOUNT и EARNEDAMOUNT меняются от месяца к месяцу.

Любая помощь в получении конечного результата приветствуется.

Ответы [ 2 ]

1 голос
/ 30 апреля 2020

Вы можете использовать условное агрегирование, если вы знаете нужные месяцы:

select ID, NAME, EFFECTIVEDATE, TERMDATE,
       sum(case when COVERMONTH = 202001 then EARNEDAMOUNT end) as ea_202001,
       sum(case when COVERMONTH = 202002 then EARNEDAMOUNT end) as ea_202002,
       . . .
from t
group by ID, NAME, EFFECTIVEDATE, TERMDATE
0 голосов
/ 30 апреля 2020

попробуйте это:

@ COVERMONTH1 и @ COVERMONTH2 - это ввод

Create Proc usp_myproject
     @COVERMONTH1 int
    ,@COVERMONTH2 int
AS
    Set nocount on

    Select ID, [NAME], EFFECTIVEDATE, TERMDATE,
           sum(case when COVERMONTH = @COVERMONTH1 then EARNEDAMOUNT end) as COVERMONTH_One,
           sum(case when COVERMONTH = @COVERMONTH2 then EARNEDAMOUNT end) as COVERMONTH_Two
    From t
    Group by ID, NAME, EFFECTIVEDATE, TERMDATE
...