САБ/К2Н 2023 — разлика између измена

Извор: SI Wiki
Пређи на навигацију Пређи на претрагу
(Resenje od kolege koji se javio na WA)
 
(Нису приказане 2 међуизмене 2 корисника)
Ред 31: Ред 31:
<syntaxhighlight lang="SQL">
<syntaxhighlight lang="SQL">
USE [BolnickoLecenje]
USE [BolnickoLecenje]
GO
/** Object:  StoredProcedure [dbo].[AzurirajIskoriscenost]    Script Date: 4/27/2024 4:18:32 PM **/
SET ANSI_NULLS ON
SET ANSI_NULLS ON
GO
GO
SET QUOTED_IDENTIFIER ON
SET QUOTED_IDENTIFIER ON
GO
GO
-- =============================================
-- Author: Sergej Vukasovic
-- Create date: 27.4.2024.
-- Description: K2N 2023
-- =============================================
CREATE PROCEDURE AzurirajIskoriscenost
@IdBol int
AS
BEGIN
SET NOCOUNT ON;
    declare @isk decimal(10,2)
declare @kap int
select @kap = Kapacitet from Bolnica where IDBol = @IdBol
select @isk = count(*) from Hospitalizacija h where DatumOtp is null and h.IDBol = @IdBol
set @isk = @isk / @kap
print(@isk)
UPDATE Bolnica
SET Iskoriscenost = CASE WHEN @isk > 0.75 THEN 'V'
WHEN @isk > 0.25 THEN 'S'
ELSE 'N' END
WHERE IDBol = @IdBol
END
GO
</syntaxhighlight>


ALTER PROCEDURE [dbo].[AzurirajIskoriscenost]
== Решење 2 ==
@IdBol int
<syntaxhighlight lang="SQL">
CREATE PROCEDURE AzurirajIskoriscenost
AS
AS
BEGIN
BEGIN
DECLARE @iskoriscenost DECIMAL(10,2)
DECLARE @percent float
DECLARE @count int
DECLARE @MyCursor CURSOR
DECLARE @idBol int, @Kapacitet int


DECLARE @tabela TABLE (id int, dolazak datetime, odlazak datetime)
SET @MyCursor = CURSOR FOR
INSERT INTO @tabela
SELECT IdBol, Kapacitet FROM dbo.Bolnica
SELECT h.IDHos, h.DatumPri, COALESCE(h.DatumOtp, getdate())
FROM Hospitalizacija h


DECLARE @maks INT
OPEN @MyCursor
FETCH NEXT FROM @MyCursor
INTO @idBol, @Kapacitet


DECLARE @rezultatTabela TABLE(id int, broj int)
while @@FETCH_STATUS = 0
INSERT INTO @rezultatTabela
BEGIN
SELECT t1.id, COUNT(*)
SET @percent = 0.0
FROM @tabela t1 JOIN @tabela t2 ON (t2.dolazak BETWEEN t1.dolazak AND t1.odlazak)
GROUP BY t1.id


SELECT @maks = MAX(broj) FROM @rezultatTabela
SELECT @count = COUNT(*)
FROM dbo.Hospitalizacija H
WHERE H.DatumOtp is NULL AND H.IDBol = @idBol
GROUP BY H.IDBol


SELECT @iskoriscenost = Kapacitet FROM Bolnica WHERE IDBol = @IdBol
print(@count)
print(@Kapacitet)
SET @percent = CAST(@count as float)/CAST(@Kapacitet as float)
print(@percent)


SET @iskoriscenost = (@maks+0.0)/@iskoriscenost
UPDATE Bolnica
SET Iskoriscenost = case
when @percent >= 0.75 then N'V'
when @percent < 0.75 and @percent >= 0.25 then N'M'
when @percent < 0.25 then N'S'
end
WHERE IDBol = @idBol


UPDATE Bolnica
FETCH NEXT FROM @MyCursor
SET Iskoriscenost = CASE WHEN @iskoriscenost > 0.75 THEN 'V'
INTO @IdBol, @Kapacitet
WHEN @iskoriscenost > 0.25 THEN 'S'
END
ELSE 'N' END
WHERE IDBol = @IdBol


CLOSE @MyCursor
DEALLOCATE @MyCursor
END
END
GO
</syntaxhighlight>
</syntaxhighlight>



Тренутна верзија на датум 9. јун 2024. у 14:23

Поставка

У систему болничког лечења прате се информације о лекарима који раде у болници и прегледима који су ти лекари обавили. Сваки пацијент може имати највише један картон у свакој од болница. Сваки картон се повремено оверава када се уписује назив послодавца преко кога је пацијент осигуран. У случајевима када је то потребно пацијенти могу бити хоспитализовани, тј. примљени на болничко лечење (датум отпуштања се попуњава тек након што се лечење заврши, а до тада је NULL).
Одговарајућа шема базе је:

Mesto(IDMes, Naziv)
Bolnica (IDBol, Naziv, Kapacitet, Iskoriscenost, IDMes)
Pacijent(IDPac, Ime, JMBG, GodineStarosti, IDMes)
Lekar(IDLek, Ime, JMBG, Specijalizacija)
Karton(IdKar, IDPac, IDBol)
Pregled(IdPre, Datum, ObjektivniNalaz, DIjagnoza, IDKar, IdLek)
Hospitalizacija(IDHos, DatumPri, DatumOtp, Dijagnoza, KlinickaSlika, IDPac, IDBol)
Overa(IDKar, RedBr, DatumOd, NazivPoslodavca)
Radi(IDLek, IDBol)

Iskoriscenost: N- Niska, S - Srednja, V - Viskoa

За посматрани систем саставити SQLServer процедуру AzurirajIskoriscenost(), која поставља атрибут искоришћеност у релацији Болница. Искоришћеност се поставља на основу врше (максималне) вредности попуњености болнице у било којем тренутку до сада. Конкретно, уколико је у било ком тренутку број хоспитализованих паицјената био преко 75% капацитета, она је висока. Уколико је мање или једнако од 75%, а више од 25% онда је средња. У супротном, уколико је мање или једнако 25% онда је њена искоришћеност ниска. У дане боравка у болници треба укључити датум пријема, али не и датум отпуштања из болнице.

Решење

USE [BolnickoLecenje]
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:		Sergej Vukasovic
-- Create date: 27.4.2024.
-- Description:	K2N 2023
-- =============================================
CREATE PROCEDURE AzurirajIskoriscenost
	@IdBol int
AS
BEGIN
	SET NOCOUNT ON;

    declare @isk decimal(10,2)
	declare @kap int

	select @kap = Kapacitet from Bolnica where IDBol = @IdBol
	select @isk = count(*) from Hospitalizacija h where DatumOtp is null and h.IDBol = @IdBol

	set @isk = @isk / @kap
	print(@isk)

	UPDATE Bolnica
	SET Iskoriscenost = CASE WHEN @isk > 0.75 THEN 'V'
							 WHEN @isk > 0.25 THEN 'S'
							 ELSE 'N' END
	WHERE IDBol = @IdBol
END
GO

Решење 2

CREATE PROCEDURE AzurirajIskoriscenost
AS
BEGIN
	DECLARE @percent float
	DECLARE @count int
	DECLARE @MyCursor CURSOR
	DECLARE @idBol int, @Kapacitet int

	SET @MyCursor = CURSOR FOR
	SELECT IdBol, Kapacitet FROM dbo.Bolnica

	OPEN @MyCursor 
	FETCH NEXT FROM @MyCursor
	INTO @idBol, @Kapacitet

	while @@FETCH_STATUS = 0
	BEGIN
		SET @percent = 0.0

		SELECT @count = COUNT(*)
		FROM dbo.Hospitalizacija H
		WHERE H.DatumOtp is NULL AND H.IDBol = @idBol
		GROUP BY H.IDBol

		print(@count)
		print(@Kapacitet)
		SET @percent = CAST(@count as float)/CAST(@Kapacitet as float)
		
		print(@percent)

		UPDATE Bolnica
		SET Iskoriscenost = case
			when @percent >= 0.75 then N'V'
			when @percent < 0.75 and @percent >= 0.25 then N'M'
			when @percent < 0.25 then N'S'
		end
		WHERE IDBol = @idBol

		FETCH NEXT FROM @MyCursor
		INTO @IdBol, @Kapacitet
	END

	CLOSE @MyCursor
	DEALLOCATE @MyCursor
END
GO

Тестирање

-- Kreiranje baze podataka
CREATE DATABASE BolnickoLecenje;
GO

-- Korišćenje baze podataka BolnickoLecenje
USE BolnickoLecenje;
GO

-- Kreiranje tabele Mesto
CREATE TABLE Mesto (
    IDMes INT PRIMARY KEY,
    Naziv NVARCHAR(50)
);

-- Kreiranje tabele Bolnica
CREATE TABLE Bolnica (
    IDBol INT PRIMARY KEY,
    Naziv NVARCHAR(100),
    Kapacitet INT,
    Iskoriscenost CHAR(1),
    IDMes INT,
    FOREIGN KEY (IDMes) REFERENCES Mesto(IDMes)
);

-- Kreiranje tabele Pacijent
CREATE TABLE Pacijent (
    IDPac INT PRIMARY KEY,
    Ime NVARCHAR(50),
    JMBG NVARCHAR(13),
    GodineStarosti INT,
    IDMes INT,
    FOREIGN KEY (IDMes) REFERENCES Mesto(IDMes)
);

-- Kreiranje tabele Lekar
CREATE TABLE Lekar (
    IDLek INT PRIMARY KEY,
    Ime NVARCHAR(50),
    JMBG NVARCHAR(13),
    Specijalizacija NVARCHAR(100)
);

-- Kreiranje tabele Karton
CREATE TABLE Karton (
    IdKar INT PRIMARY KEY,
    IDPac INT,
    IDBol INT,
    FOREIGN KEY (IDPac) REFERENCES Pacijent(IDPac),
    FOREIGN KEY (IDBol) REFERENCES Bolnica(IDBol)
);

-- Kreiranje tabele Pregled
CREATE TABLE Pregled (
    IdPre INT PRIMARY KEY,
    Datum DATE,
    ObjektivniNalaz NVARCHAR(MAX),
    DIjagnoza NVARCHAR(MAX),
    IDKar INT,
    IdLek INT,
    FOREIGN KEY (IDKar) REFERENCES Karton(IdKar),
    FOREIGN KEY (IdLek) REFERENCES Lekar(IDLek)
);

-- Kreiranje tabele Hospitalizacija
CREATE TABLE Hospitalizacija (
    IDHos INT PRIMARY KEY,
    DatumPri DATE,
    DatumOtp DATE,
    Dijagnoza NVARCHAR(MAX),
    KlinickaSlika NVARCHAR(MAX),
    IDPac INT,
    IDBol INT,
    FOREIGN KEY (IDPac) REFERENCES Pacijent(IDPac),
    FOREIGN KEY (IDBol) REFERENCES Bolnica(IDBol)
);

-- Kreiranje tabele Overa
CREATE TABLE Overa (
    IDKar INT,
    RedBr INT,
    DatumOd DATE,
    NazivPoslodavca NVARCHAR(100),
    FOREIGN KEY (IDKar) REFERENCES Karton(IdKar)
);

-- Kreiranje tabele Radi
CREATE TABLE Radi (
    IDLek INT,
    IDBol INT,
    FOREIGN KEY (IDLek) REFERENCES Lekar(IDLek),
    FOREIGN KEY (IDBol) REFERENCES Bolnica(IDBol)
);

-- Popunjavanje tabela Mesto, Bolnica, Pacijent, Lekar - Primer podataka
INSERT INTO Mesto (IDMes, Naziv) VALUES
(1, 'Beograd'),
(2, 'Novi Sad'),
(3, 'Niš');

INSERT INTO Bolnica (IDBol, Naziv, Kapacitet, Iskoriscenost, IDMes) VALUES
(1, 'Klinički centar Srbije', 1000, 'V', 1),
(2, 'Klinički centar Novi Sad', 800, 'S', 2),
(3, 'Klinički centar Niš', 700, 'N', 3);

INSERT INTO Pacijent (IDPac, Ime, JMBG, GodineStarosti, IDMes) VALUES
(1, 'Marko Marković', '0101991734567', 45, 1),
(2, 'Ana Anić', '0202992834567', 35, 2),
(3, 'Petar Petrović', '0303993934567', 50, 3);

INSERT INTO Lekar (IDLek, Ime, JMBG, Specijalizacija) VALUES
(1, 'Milica Milenković', '0404994834567', 'Opšta medicina'),
(2, 'Stefan Stefanović', '0505995934567', 'Hirurgija'),
(3, 'Jovana Jovanović', '0606996034567', 'Pediatrija');

-- Dodavanje ostalih podataka u preostale tabele prema potrebi
-- Popunjavanje tabele Karton - Primer podataka
INSERT INTO Karton (IdKar, IDPac, IDBol) VALUES
(1, 1, 1),
(2, 2, 2),
(3, 3, 3);

-- Popunjavanje tabele Pregled - Primer podataka
INSERT INTO Pregled (IdPre, Datum, ObjektivniNalaz, DIjagnoza, IDKar, IdLek) VALUES
(1, '2024-04-20', 'Normalan nalaz.', 'Prehlada', 1, 1),
(2, '2024-04-22', 'Upala slepog creva.', 'Akutni abdomen', 2, 2),
(3, '2024-04-25', 'Visoka temperatura.', 'Grip', 3, 3);

-- Popunjavanje tabele Hospitalizacija - Primer podataka
INSERT INTO Hospitalizacija (IDHos, DatumPri, DatumOtp, Dijagnoza, KlinickaSlika, IDPac, IDBol) VALUES
(1, '2024-04-20', NULL, 'Prehlada', 'Pacijent ima simptome prehlade.', 1, 1),
(2, '2024-04-22', NULL, 'Upala slepog creva', 'Pacijent ima jake bolove u stomaku.', 2, 2),
(3, '2024-04-25', NULL, 'Grip', 'Pacijent ima visoku temperaturu i kašalj.', 3, 3);

-- Popunjavanje tabele Overa - Primer podataka
INSERT INTO Overa (IDKar, RedBr, DatumOd, NazivPoslodavca) VALUES
(1, 1, '2024-04-20', 'RFZO'),
(1, 2, '2024-04-22', 'RFZO'),
(2, 1, '2024-04-22', 'Dunav osiguranje'),
(3, 1, '2024-04-25', 'Univerzal osiguranje');

-- Popunjavanje tabele Radi - Primer podataka
INSERT INTO Radi (IDLek, IDBol) VALUES
(1, 1),
(2, 2),
(3, 3);