#sql #sql-server
#sql #sql-сервер
Вопрос:
У меня есть эта таблица, скажем, Students. Если в таблице есть 2 students и результирующий набор выдает 2 строки, я хочу добавить еще 5 строк с фиктивными данными в нем, независимо от того, что там написано, т. е. ‘ Dummy Record
‘ или что-то в этом роде.
SELECT FirstName, (SELECT COUNT(*) FROM Student) Total
FROM Student
Если вывод из приведенного выше запроса похож на этот.
FirstName Total
Isaac Frempong 2
Erick Ortiz 2
Я хочу, чтобы результат был таким
FirstName Total
Isaac Frempong 2
Erick Ortiz 2
Dummy Data 2
Dummy Data 2
Dummy Data 2
Dummy Data 2
Dummy Data 2
Я надеюсь, что это достижимо, я не могу понять, как применить здесь операторы CASE или IF. Может быть, кто-нибудь мог бы помочь.
Ответ №1:
Один из методов заключается в использовании VALUES()
инструкции для построения строк:
SELECT FirstName, COUNT(*) OVER () as Total
FROM Student
UNION ALL
SELECT 'Dummy', (SELECT COUNT(*) FROM Student)
FROM (VALUES (1), (2), (3), (4), (5)) v(n);
Редактировать:
Если вам всегда нужны 7 строк, используйте арифметику:
SELECT FirstName, COUNT(*) OVER () as Total
FROM Student
UNION ALL
SELECT 'Dummy', s.total
FROM (VALUES (1), (2), (3), (4), (5), (6), (7)) v(n) CROSS JOIN
(SELECT COUNT(*) as total FROM Student) s
WHERE v.n <= 7 - s.total;
s
Комментарии:
1. Это нормально, если бы мне в любом случае пришлось добавить 5 строк фиктивных данных, но если количество строк / учащихся равно 7 или более 7, то не следует добавлять никаких дополнительных строк. Например, если есть 3 строки, следует добавить 4 дополнительные строки, если есть 4 студента, тогда следует добавить 3 дополнительные строки и так далее.
2. Это отличный материал.
Ответ №2:
Вот код, работающий с таблицей varaibale, которую я назвал @students
Пожалуйста, замените его вашей собственной таблицей
Я заполнил эту таблицу некоторыми данными и протестировал разные случаи (количество записей меньше 7 или больше 7, и работал так, как вы пожелаете !)
1) Сначала создайте переменную таблицу с именем @mytable, которая будет заполнена n записями
n будет равно 7, если количество записей в вашей таблице students равно или меньше 7
n будет количеством записей в вашей таблице student, если оно больше 7
2) Затем сделайте правое внешнее соединение между вашей таблицей student, к которой вы добавляете номер записи, используя CTE , функцию row_number().
declare @students as table(id int identity(1,1),firstname nvarchar(50))
insert into @students(firstname) values
('Ali ben Hassine'),
('Mohamed el Aabed'),
('Ali ben Hassine'),
('Mohamed el Aabed'),
('Mohamed el Aabed'),
('Tahar Harbi'),
('Hassine Ayari'),
('Ihsen Trabelsi'),
('Marwa Mostari'),
('Mourad Zmerli'),
('Hafedh Gabsi'),
('Miloud Filali');
declare @mytab as table(n int)
declare @n as int
select @n=count(distinct(firstname)) from @students
if @n<7 set @n=7
declare @i as int
set @i=1
while @i <@n 1
begin
insert into @mytab values(@i)
set @i=@i 1
end;
with cte as
(select row_number() over(partition by 1 order by firstname) r#,firstname,count(1) Total from @students group by firstname)
select isnull(cte.firstname,'Dummy') firstanme,isnull(cte.total,2) Total from cte
right outer join @mytab t2 on cte.r#=t2.n
[![enter image description here][1]][1]