Размещение итогов последнего не в правильном порядке

#sql-server

#sql-server

Вопрос:

Я написал следующий запрос, чтобы добавить общее количество после каждого типа класса, чтобы отобразить общее количество посещений после каждого класса.

Мой вывод запроса следующий введите описание изображения здесь

Я написал следующий запрос, чтобы показать общее количество после / ниже каждого имени.

 DECLARE @tblMissingAttendance TABLE (Name varchar(20), AttendanceDate DATE);



INSERT INTO @tblMissingAttendance VALUES
('KG 1-A'   ,'2019-04-09'),
('GR 10-A'  ,'2019-04-09'),
('GR 10-B'  ,'2019-04-09'),
('GR 10-B'  ,'2019-04-08'),
('GR 10-B'  ,'2019-04-06'),
('GR 10-B'  ,'2019-04-05'),
('GR 10-B'  ,'2019-04-03'),
('GR 10-B'  ,'2019-04-02'),
('GR 10-B'  ,'2019-04-01'),
('GR 10-B'  ,'2019-03-30');



Select Name, AttendanceDate 
                        From @tblMissingAttendance;

;with cteTemp as (Select Name,AttendanceDate 
                        From @tblMissingAttendance
                        )


Select Name,CAST(AttDate as VARCHAR) FROM (SELECT Name, 
        CAST(AttendanceDate as varchar) as AttDate,
        1 AS Total,
        Name as t
        FROM cteTemp AS ma
UNION ALL

SELECT 'Total', 
        CAST(sum(1) as varchar),
        sum(1),
        Name as t
        FROM cteTemp AS ma
        GROUP BY Name
) as ma
ORDER BY t,Total

  

Неправильный вывод изображения
введите описание изображения здесь

Комментарии:

1. Для меня порядок выглядит правильным (для того, что вы спросили), если вы добавите t в SELECT список, вы увидите, почему: db<>fiddle . Какой порядок вы ожидаете? Почему бы не использовать ROLLUP вместо этого, если вам нужны агрегаты для наборов групп?

Ответ №1:

это проблема order by varchar, я добавил еще один столбец, чтобы исправить порядок по проблеме.

 Select Name,CAST(AttDate as VARCHAR) FROM (SELECT Name, 
        CAST(AttendanceDate as varchar) as AttDate,
        1 AS Total,
        Name as t,
        0 AS OrderBy
        FROM cteTemp AS ma
UNION ALL
SELECT 'Total', 
        CAST(sum(1) as varchar),
        sum(1),
        Name as t,
        1 AS OrderBy
        FROM cteTemp AS ma
        GROUP BY Name
) as ma
ORDER BY t,OrderBy
  

Комментарии:

1. Отлично! Он работает отлично. Большое вам спасибо @Hasan

Ответ №2:

Вместо использования SUM(1) вы должны использовать COUNT(*) . А для общего столбца вы можете просто использовать 2. Ваши столбцы Total и t имеют запутанные имена. Вам было бы лучше назвать их чем-то более соответствующим тому, что они делают. Следует еще отметить, что вы всегда должны указывать длину своих строк.

 SELECT  Name,
        CAST(AttDate as VARCHAR(10)) 
FROM (SELECT Name, 
            CAST(AttendanceDate as varchar(10)) as AttDate,
            1 AS [GroupOrder],
            Name as [GroupName]
        FROM cteTemp AS ma
        UNION ALL
        SELECT 'Total' AS Name, 
            CAST(COUNT(*) as varchar(10)),
            2 AS [GroupOrder],
            Name as [GroupName]
        FROM cteTemp AS ma
        GROUP BY Name) as ma
ORDER BY GroupName, GroupOrder;