Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Процедура на вставку в таблицу  [new]
kimisa
Member

Откуда:
Сообщений: 14
Я составила процедуру
CREATE PROCEDURE int_Svod 
AS
BEGIN
	DECLARE @kol int, @i int, @l int, @num int, @s1 int, @s2 int, @kod int, @k int, @n int;
	select  count(*) kol from Hosp;
	set @i=1;
	while (@i<@kol+1)
	begin 
	    select Hosp.name, count(Recept.id_rec) k from Hosp, Recept where Recept.id_hosp = Hosp.id and Recept.period between '2012-01-01' AND '2012-12-31' 
	    and Hosp.id=@i group by Hosp.name;
	    select len(@k) l;
	    select REPLICATE('9', @l) s1;
	    set @s2=10*(@l-1);
	    select((@s1-@s2+1)*rand()+@s2) num;
		while(@num>=@k)
		begin
	        select((@s1-@s2+1)*rand()+@s2) num;
		end;
	    select MAX(id_lpu) as n from Svod;
	    if (@i=1)
	    begin
	        insert into Svod values (1, @num, '2012');
	    end;
	    else 
	    begin
	        set @kod=@n+1;
			insert into Svod values (@kod, @num, '2012');
	    end;
	    set @i=@i+1;		  
	end;
END
GO


Результатом работы должна быть вставка записей в таблицу. Но в итоге работает самое начало- select count(*) kol from Hosp.
Что у меня не так?
24 фев 12, 04:19    [12144747]     Ответить | Цитировать Сообщить модератору
 Re: Процедура на вставку в таблицу  [new]
Lasa
Member

Откуда: Canada
Сообщений: 81
А чему у Вас равен @kol в строке while (@i<@kol+1) ? По-моему NULL
Может надо было
SET @kol = (select  count(*) kol from Hosp);
24 фев 12, 05:15    [12144761]     Ответить | Цитировать Сообщить модератору
 Re: Процедура на вставку в таблицу  [new]
kimisa
Member

Откуда:
Сообщений: 14
Так в запросе
select  count(*) [color=blue]kol [/color]from Hosp

и определяется чему равно kol. Или я что-то не так делаю?
24 фев 12, 08:25    [12144828]     Ответить | Цитировать Сообщить модератору
 Re: Процедура на вставку в таблицу  [new]
kimisa
Member

Откуда:
Сообщений: 14
Точно, наверное в этом и дело. Вечером проверю.
24 фев 12, 08:27    [12144834]     Ответить | Цитировать Сообщить модератору
 Re: Процедура на вставку в таблицу  [new]
iljy
Member

Откуда:
Сообщений: 8711
kimisa,

А что это вообще должно делать? Зачем тут цикл?
24 фев 12, 09:54    [12145109]     Ответить | Цитировать Сообщить модератору
 Re: Процедура на вставку в таблицу  [new]
kimisa
Member

Откуда:
Сообщений: 14
Надо генерировать случайным образом числа, но не большие определенного значения из другой (первой) таблицы и затем полученные данные забивать во 2 таблицу.
24 фев 12, 11:49    [12145779]     Ответить | Цитировать Сообщить модератору
 Re: Процедура на вставку в таблицу  [new]
iljy
Member

Откуда:
Сообщений: 8711
kimisa,

ну так и генерируйте, цикл-то зачем?
24 фев 12, 13:53    [12146762]     Ответить | Цитировать Сообщить модератору
 Re: Процедура на вставку в таблицу  [new]
kimisa
Member

Откуда:
Сообщений: 14
В делфи или с++ я знаю как генерировать в определенных пределах, а здесь не нашла нормального примера. Как тогда сгенерировать число в пределах, например от 1 до 133?
24 фев 12, 14:26    [12147108]     Ответить | Цитировать Сообщить модератору
 Re: Процедура на вставку в таблицу  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
kimisa
В делфи или с++ я знаю как генерировать в определенных пределах, а здесь не нашла нормального примера. Как тогда сгенерировать число в пределах, например от 1 до 133?
132*RAND()+1
24 фев 12, 14:41    [12147218]     Ответить | Цитировать Сообщить модератору
 Re: Процедура на вставку в таблицу  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
А вот как добиться, чтобы эти числа генерировались для каждой строки запроса, - это другой вопрос.
Попробуйте RAND(CHECKSUM(NEWID())) вместо RAND()
24 фев 12, 14:44    [12147247]     Ответить | Цитировать Сообщить модератору
 Re: Процедура на вставку в таблицу  [new]
kimisa
Member

Откуда:
Сообщений: 14
Спасибо. А то пришлось извращенствоваться так. :)
24 фев 12, 14:45    [12147251]     Ответить | Цитировать Сообщить модератору
 Re: Процедура на вставку в таблицу  [new]
invm
Member

Откуда: Москва
Сообщений: 9845
kimisa
Надо генерировать случайным образом числа, но не большие определенного значения из другой (первой) таблицы и затем полученные данные забивать во 2 таблицу.
declare @t table (v int);

insert into @t
values
 (5), (100), (10), (300)
 
select
 cast(rand(checksum(newid())) * v + 1 as int)
from
 @t;
24 фев 12, 14:45    [12147256]     Ответить | Цитировать Сообщить модератору
 Re: Процедура на вставку в таблицу  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
А вот, кстати, преобразование результата в INT портит
равновероятность вблизи граничных значений диапазона.
Если это важно, конечно.

К примеру, в оригинальном RAND() декларируется, что 0
точно так же вероятен, как и все прочие значения вплоть до 1.

Однако, после округления до целого значение 1 получается при значениях 132*RAND()+1
от 1 до 1.5, тогда как значения в середине диапазона получаются как в результате
отбрасывания дробной части менее 0.5, так и увеличения до ближайшего целого,
если дробная часть получилась >=0.5.
24 фев 12, 15:08    [12147417]     Ответить | Цитировать Сообщить модератору
 Re: Процедура на вставку в таблицу  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
invm
kimisa
Надо генерировать случайным образом числа, но не большие определенного значения из другой (первой) таблицы и затем полученные данные забивать во 2 таблицу.
declare @t table (v int);

insert into @t
values
 (5), (100), (10), (300)
 
select
 cast(rand(checksum(newid())) * v + 1 as int)
from
 @t;
Предлагаю:
declare @t table (v1 int, v2 int);

insert @t(v1,v2) values (1,5), (1,100), (1,10), (1,300);
 
select cast(rand(checksum(newid())) * (v2 - v1 + 0.9999) + v1 - 0.5 as int)
from @t;
Количество девяток в числе 0.9999 - чем больше, тем лучше.
Если туда 1 поставить, то можно получить на 1 больше, чем максимально допустимое число.

P.S. Может, и по-другому можно
24 фев 12, 15:50    [12147828]     Ответить | Цитировать Сообщить модератору
 Re: Процедура на вставку в таблицу  [new]
kimisa
Member

Откуда:
Сообщений: 14
Не совсем то, что надо. Приведу полностью задание
---------------------------------------------------
Таблица посещений Recept больниц пациентами

id_hosp - уник. числ идент больницы
id_rec - уник. числ идент посещения
period - уник.идент период в формате YYYYMM например 201001 (фнв 2010)
id_pacient - уник. числ идент пациента

Таблица Pacient
id - уник. идент пациента
name - фио

Таблица Hosp
id - уник. идент больницы
name - Название


Имеется таблица желаемая годовая отчетность Svod

id_lpu -уник. числ идент больницы
cnt - кол0во посещений в год
period- отчетный год (2011 итп)

Задача состоит в

1 Составить запрос в котором посчитать кол-во посещений для каждой лпу в год , количество уникальных пациентов в год для каждой лпу, т.е. в резулт. таб-це должны быть колонки:

- ЛПУ
- КОл-во посещений в год
- КОл-во уникальных Пациентов в год


2 Заполнить табл Svod записями, т.е. 1 запись для каждой больныцы, где кол-во посещений в год было случайным но не большим реального за год , отличным от нуля, но меньше чем в реальности, если посчитать по таблице Recept за год (все это оформить
процедурой)

3 Оформить процедурой вывод данных для отчета , который бы выводил списки людей по каждому ЛПУ из табл Recept исходя из того, что суммарное кол-во посещений подгоняете к кол-ву таблице SVOD поле cnt, и желательно чтобы равномерно
по месяцам отсеивал посещения

колонки должны быть:
-ЛПУ
-ФИО
-Кол-во посещений в год

В качестве входного параметра указываете год, id_lpu
---------------------------------------------------------------

Первое задание сделала. Сейчас сижу над вторым. И еще осталось третье. По поводу третьего меня сильно напрягают слова "желательно чтобы равномерно по месяцам отсеивал посещения".
24 фев 12, 16:46    [12148422]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить