Добавить дополнительные строки в результирующий набор запроса с фиктивными данными в sql server

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