Как получить значения столбца Рейтинг вместе с их определением для каждого указанного c месяца, используя сводную с Месяцем в MSSQL - PullRequest
3 голосов
/ 17 февраля 2020

Пример:

Данные:

GraphDetails
|----------------------------------------------------------|
| Id  GoalId  Definition                Rating  DateCrated |
| -------------------------------------------------------- |
| 1   2       Zero Infra Back Log       100     2020-02-05 |
| 2   2       Happy Customers           95      2020-02-05 |
| 3   2       Complete All Projects     100     2020-02-05 |
| 4   1       Zero Infra Back Log       100     2020-02-05 |
| 5   1       Happy Customers           98      2020-02-05 |
| 6   1       Complete All Projects     100     2020-02-05 |
|----------------------------------------------------------|

Запрос:

SELECT
 [1] AS Jan,
 [2] AS Feb,
 [3] AS Mar,
 [4] AS Apr,
 [5] AS May,
 [6] AS Jun,
 [7] AS Jul,
 [8] AS Aug,
 [9] AS Sep,
 [10] AS Oct,
 [11] AS Nov,
 [12] AS [Dec]
FROM
(Select Id, MONTH(DateRecorded) as TMonth
  FROM GraphDetails
    WHERE YEAR(DateRecorded) = 2020 AND GoalId = 1
    ) source
PIVOT
( Definition, Rating
    FOR TMonth
    IN ( [1], [2], [3], [4], [5], [6], [7], [8], [9], [10], [11], [12] ) 
) AS pvtMonth

Я получаю эту ошибку:

Неверный синтаксис рядом с ','.

В соответствии с"Определение, Рейтинг "

Результат должен выглядеть следующим образом:

|-------------------------------------------------------------------------------------------------|
| Definition              | Jan | Feb | Mar | Apr | May | Jun | Jul | Aug | Sep | Oct | Nov | Dec |
|-------------------------------------------------------------------------------------------------|
| Zero Infra Back Log     | 0   | 100 | 0   | 0   | 0   | 0   | 0   | 0   | 0   | 0   | 0   | 0   |
| Happy Customers         | 0   | 98  | 0   | 0   | 0   | 0   | 0   | 0   | 0   | 0   | 0   | 0   |
| Complete All Projects   | 0   | 100 | 0   | 0   | 0   | 0   | 0   | 0   | 0   | 0   | 0   | 0   |
|-------------------------------------------------------------------------------------------------|

Возможно ли это? Любая помощь, пожалуйста!

Спасибо!

* Приведенный выше код основан на PIVOT с МЕСЯЦЕМ () .

Ответы [ 2 ]

3 голосов
/ 17 февраля 2020

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

select 
    definition,
    sum(case 
        when dateRecorded >= datefromparts(2020, 1, 1) and dateRecorded < datefromparts(2020, 2, 1)
        then rating
        else 0
    end) Jan,
    sum(case 
        when dateRecorded >= datefromparts(2020, 2, 1) and dateRecorded < datefromparts(2020, 3, 1)
        then rating
        else 0
    end) Feb,
    ...
    sum(case 
        when dateRecorded >= datefromparts(2020, 12, 1) and dateRecorded < datefromparts(2021, 1, 1)
        then rating
        else 0
    end) Dec
from graphDetails
where dateRecorded >= datefromparts(2020, 1, 1) and dateRecorded < datefromparts(2021, 1, 1)
group by definition
order by definition

Этот синтаксис несколько более гибок, чем оператор Speci c PIVOT (а также, что стоит, он работает в разных продуктах баз данных). ).

Обратите внимание, что я изменил фильтры по датам, чтобы они использовали полуоткрытые интервалы, и в столбце dateRecorded не применяется функция даты: это должно позволить базе данных использовать индекс по дате столбец (и также будет плавно обрабатывать компонент времени dateCreated, если есть).

1 голос
/ 17 февраля 2020

Запрос:

SELECT [Definition], isnull([1],0) AS Jan,
         isnull([2],0) AS Feb,
         isnull([3],0) AS Mar,
         isnull([4],0) AS Apr,
         isnull([5],0) AS May,
         isnull([6],0) AS Jun,
         isnull([7],0) AS Jul,
         isnull([8],0) AS Aug,
         isnull([9],0) AS Sep,
         isnull([10],0) AS Oct,
         isnull([11],0) AS Nov,
         isnull([12],0) AS [Dec]
        FROM
       (Select Id, MONTH(DateCrated) as TMonth,[Definition],Rating
          FROM GraphDetails
       WHERE YEAR(DateCrated) = 2020 AND GoalId = 1
        ) [source]
    PIVOT
    (  
    sum(Rating)
        FOR TMonth 
        IN ( [1], [2], [3], [4], [5], [6], [7], [8], [9], [10], [11], [12] ) 
    ) AS pvtMonth

Результат:

...