#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;