SQL Server: группировка по неправильному порядку результатов - PullRequest
0 голосов
/ 10 октября 2018

Мне нужно написать запрос, в котором результаты будут сгруппированы по месяцам и годам, а также по «Оценке».Например, данные таблицы:

DECLARE @Scores TABLE (
    [SubmissionDate] DATETIME,
    [Score] INT,
    [Grade] VARCHAR(7)
)
INSERT INTO @Scores VALUES
('2018-08-01', 60, 'AVERAGE'),
('2018-08-01', 50, 'POOR'),
('2018-09-01', 68, 'AVERAGE'),
('2018-09-01', 66, 'AVERAGE'),
('2018-07-01', 64, 'AVERAGE'),
('2018-07-01', 56, 'POOR'),
('2018-08-01', 62, 'AVERAGE'),
('2018-08-01', 80, 'GOOD'),
('2018-09-01', 52, 'POOR'),
('2018-09-01', 54, 'POOR'),
('2018-07-01', 58, 'POOR'),
('2018-08-01', 50, 'POOR'),
('2018-09-01', 82, 'GOOD'),
('2018-09-01', 86, 'GOOD'),
('2018-07-01', 62, 'AVERAGE'),
('2018-07-01', 84, 'GOOD'),
('2018-07-01', 82, 'GOOD'),
('2018-08-01', 88, 'GOOD')

Что мне нужно, так это среднее количество баллов за каждый месяц для каждого класса.Я могу получить среднее значение правильно.Для меня не работает порядок месяцев.Результаты отображаются в алфавитном порядке (август отображается до июля, а затем в сентябре). Правильный порядок должен быть -> июль, август, сентябрь

Вот запрос, который я написал:

;WITH CTE AS(
    SELECT 
        LEFT(UPPER(DATENAME(MM, [SubmissionDate])),3) + '-' + DATENAME(YY, [SubmissionDate]) AS [Range]
       ,[Score]
       ,[Grade]
    FROM @Scores
)
SELECT [Range], AVG([Score]) AS [AverageScore], [Grade]
FROM CTE GROUP BY [Range], [Grade]

Вот вывод:

Range       AverageScore    Grade
AUG-2018    61              AVERAGE
JUL-2018    63              AVERAGE
SEP-2018    67              AVERAGE
AUG-2018    84              GOOD
JUL-2018    83              GOOD
SEP-2018    84              GOOD
AUG-2018    50              POOR
JUL-2018    57              POOR
SEP-2018    53              POOR

Мне нужен правильный порядок первого столбца.

Ответы [ 3 ]

0 голосов
/ 10 октября 2018

используйте этот код:

;WITH CTE AS(
SELECT 
LEFT(UPPER(DATENAME(MM, [SubmissionDate])),3) + '-' + DATENAME(YY, [SubmissionDate]) AS [Range], [SubmissionDate]
,[Score]
,[Grade]
FROM @Scores
)
SELECT [Range], AVG([Score]) AS [AverageScore], [Grade]
FROM CTE GROUP BY [Range], [Grade],[SubmissionDate]
order by [SubmissionDate]
0 голосов
/ 10 октября 2018

Вы можете добавить дополнительный столбец для сортировки.

;WITH CTE AS(
    SELECT 
        LEFT(UPPER(DATENAME(MM, [SubmissionDate])),3) + '-' + DATENAME(YY, [SubmissionDate]) AS [Range]
        ,[Score]
        ,[Grade]
        , CONVERT(VARCHAR(6), [SubmissionDate], 112) AS [RangeOrder] -- ISO: 112 = yyyymmdd
    FROM @Scores
)
SELECT 
    [Range], 
    AVG([Score]) AS [AverageScore], 
    [Grade]
FROM CTE 
GROUP BY [Range], [Grade], [RangeOrder]
ORDER BY [RangeOrder]

Результат:

Range                              AverageScore Grade
---------------------------------- ------------ -------
JUL-2018                           63           AVERAGE
JUL-2018                           83           GOOD
JUL-2018                           57           POOR
AUG-2018                           61           AVERAGE
AUG-2018                           84           GOOD
AUG-2018                           50           POOR
SEP-2018                           67           AVERAGE
SEP-2018                           84           GOOD
SEP-2018                           53           POOR
0 голосов
/ 10 октября 2018

Я бы рекомендовал сначала указывать год, а затем название месяца.Затем ORDER BY с использованием этого значения преобразуется в datetime через TRY_CONVERT:

WITH cte AS (
    SELECT 
        DATENAME(YY, [SubmissionDate]) + '-' +
            LEFT(UPPER(DATENAME(MM, [SubmissionDate])), 3) AS [Range],
        [Score],
        [Grade]
    FROM @Scores
)

SELECT
    [Range],
    AVG([Score]) AS [AverageScore],
[Grade]
FROM cte
GROUP BY
    [Range],
    [Grade]
ORDER BY
    TRY_CONVERT(datetime, [Range]);

enter image description here

Демонстрация

Примечание. Если вы хотите добавить еще один уровень заказа, до или после даты, вы можете сделать это, и это не должно повлиять на логику заказа, использованную выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...