02 - SQL Server - Taller Intermedio - Prácticas
Introducción
Antes de comenzar con las prácticas vamos a necesitar generar el modelo de datos, cabe aclarar que cada participante va a tener un modelo de datos
propio sobre el cual deberá realizar las prácticas.
Para esto vamos a necesitar conectarnos al servidor de Desarrollo de ART, seleccionar la BD ARTBD01 tal cual aprendimos en la Lección 3 del taller
Inicial y luego ejecutar la siguiente sentencia reemplazando el valor nombre_usuario por el de la participante que esta llevando a cabo las prácticas. (Por
ej. jperez)
USE ARTBD01
EXEC [dbo].[usp_iGenerarDatosPruebaTallerSQLDatosIntermedio] @pc_Usuario = 'nombre_usuario'
Una vez finalizada la ejecución tendremos creado un modelo de datos similar al siguiente.
Como indicamos anteriormente cada participante va a tener su propio modelo de datos con lo cual las tablas van a iniciar con el prefijo nombre_usuario,
por ejemplo:
Para el participante jperez, las tablas quedarían nombradas de la siguiente forma:
tps.jperez_Codigos_Diagnostico_CIE10
tps.jperez_Siniestros_Codigos_Diagnostico_CIE10
tps.jperez_Provincias
tps.jperez_Localidades
tps.jperez_Personas_Domicilios
tps.jperez_Siniestros
tps.jperez_Personas
tps.jperez_Empresas
tps.jperez_Sexos
tps.jperez_Tipos_Accidentes
Ejercicio 1
Documentación Relacionada: Lección 2 - Consultas Multi-Tablas (INNER JOIN)
Se necesita obtener un listado que contenga los últimos 20 siniestros ingresados, el reporte debe contar con las siguientes 3 columnas:
Siniestro
Fecha Accidente
Apellido y Nombre del Accidentado
SELECT TOP 20 s.siniestro,
s.fecha_accidente,
CONCAT(p.apellido,' ',p.nombre) as accidentado
FROM tps.Siniestros s (NOLOCK)
INNER JOIN tps.Personas p (NOLOCK)
ON s.id_persona = p.id
ORDER BY s.siniestro DESC
Ejercicio 2
Documentación Relacionada: Lección 2 - Consultas Multi-Tablas (LEFT JOIN)
Se necesita obtener un listado que contenga todos los siniestros ingresados con su respectivo código CIE10- y descripción, en el caso de no tener datos
mostrar vacío.
El reporte debe contar con las siguientes columnas:
Siniestro
Fecha Accidente
CIE10
Descripción CIE10
SELECT s.siniestro, s.fecha_accidente, ISNULL(cdc.cie10,'') AS cie10, ISNULL(cdc.descripcion,'') AS
descripcion
FROM tps.Siniestros s (NOLOCK)
LEFT JOIN tps.Codigos_Diagnostico_CIE10 cdc (NOLOCK)
ON s.id_codigo_diagnostico_cie10 = cdc.id
Ejercicio 3
Documentación Relacionada: Lección 2 - Consultas Multi-Tablas (INNER + LEFT JOIN)
Se necesita obtener un listado que contenga los últimos 10 siniestros ingresados, el reporte debe contar con las siguientes 7 columnas:
Siniestro
Fecha Accidente
Apellido y Nombre del Accidentado
Cie10
Descripción Cie10
Numero de Contrato
Razón Social de la Empresa
Tenga en cuenta que el siniestro puede tener o no el CIE10 cargado, el registro se debe mostrar de todas formas reemplazando los valores Nulos por
vacios.
SELECT TOP 10 s.siniestro,
s.fecha_accidente,
CONCAT(p.apellido,' ',p.nombre) as accidentado,
ISNULL(cdc.cie10,'') AS cie10,
ISNULL(cdc.descripcion,'') AS descripcion,
e.numero_contrato,
e.razon_social
FROM tps.Siniestros s (NOLOCK)
INNER JOIN tps.Personas p (NOLOCK)
on s.id_persona = p.id
INNER JOIN tps.Empresas e (NOLOCK)
ON s.id_empresa = e.id
LEFT JOIN tps.Codigos_Diagnostico_CIE10 cdc (NOLOCK)
ON s.id_codigo_diagnostico_cie10 = cdc.id
ORDER BY s.siniestro DESC
Ejercicio 4
Documentación Relacionada: Lección 3 - Combinar Consultas (SQL UNION - UNION ALL)
Se necesita listar en un mismo reporte los grupos de siniestros que cumplan las siguientes condiciones:
Grupo 01: Siniestros cuya fecha de accidente sea 17-07-2020 y sean del tipo de accidente Reagravación.
Grupo 02: Siniestros cuya Empresa tenga menos de 25 empleados.
El reporte debe contar con las siguientes columnas y no se deben duplicar los registros.
Siniestro
Fecha Accidente
Tipo Accidente
SELECT s.siniestro, s.fecha_accidente, s.tipo_accidente
FROM tps.Siniestros s (NOLOCK)
WHERE s.id_tipo_accidente = 3 --'Reagravación'
AND s.fecha_accidente = '20200717'
UNION
SELECT s.siniestro, s.fecha_accidente, s.tipo_accidente
FROM tps.Siniestros s (NOLOCK)
INNER JOIN tps.Empresas e (NOLOCK)
ON s.id_empresa = e.id
WHERE e.cantidad_empleados < 25
ORDER BY s.siniestro
Ejercicio 5
Documentación Relacionada: Lección 5 - Tablas
Crear una nueva tabla denominada tps.usuario_Siniestros_Altas_Medicas (reemplazar usuario, por el usuario del participante, por tps.jperez_Siniestros
_Altas_Medicas), la cual se va a utilizar para almacenar las Altas Médicas que se generen para los siniestros.
La misma de contener ademas de una clave primaria, una clave foránea a la tabla tps.SIniestros y los campos de Auditoria los siguientes campos:
Fecha Alta Medica
Observaciones
Nombre del Medico
CREATE TABLE tps.Siniestros_Altas_Medicas(
[id] [int] CONSTRAINT PK_Siniestros_Altas_Medicas PRIMARY KEY CLUSTERED IDENTITY(1,1),
[id_siniestro] [int] NOT NULL FOREIGN KEY REFERENCES tps.Siniestros(id),
[fecha_alta_medica] [smalldatetime] NOT NULL,
[observaciones] [varchar](MAX) NOT NULL,
[medico] [varchar](500) NOT NULL,
[fecha_alta_registro] [smalldatetime] DEFAULT GETDATE() NOT NULL,
[legajo_alta_registro] [int] NOT NULL,
[fecha_modificacion_registro] [smalldatetime] NULL,
[lejajo_modificacion_registro] [int] NULL,
[fecha_baja_registro] [smalldatetime] NULL,
[lejajo_baja_registro] [int] NULL)
-- Propiedades Extendidas Tabla
EXEC sys.sp_addextendedproperty
@name=N'Descripcion',
@value=N'Esta tabla tiene como funcionalidad almacenar las Altas Médicas de los Siniestros',
@level0type=N'SCHEMA',
@level0name=N'tps',
@level1type=N'TABLE',
@level1name=N'Siniestros_Altas_Medicas'
--Propiedades Extendidas - Campos
EXEC sys.sp_addextendedproperty
@name=N'Descripcion',
@value=N'Identificador de la tabla',
@level0type=N'SCHEMA',
@level0name=N'tps',
@level1type=N'TABLE',
@level1name=N'Siniestros_Altas_Medicas',
@level2type=N'COLUMN',
@level2name=N'id'
EXEC sys.sp_addextendedproperty
@name=N'Descripcion',
@value=N'FK a la tabla Siniestros',
@level0type=N'SCHEMA',
@level0name=N'tps',
@level1type=N'TABLE',
@level1name=N'Siniestros_Altas_Medicas',
@level2type=N'COLUMN',
@level2name=N'id_siniestro'
EXEC sys.sp_addextendedproperty
@name=N'Descripcion',
@value=N'Indica la fecha del alta médica',
@level0type=N'SCHEMA',
@level0name=N'tps',
@level1type=N'TABLE',
@level1name=N'Siniestros_Altas_Medicas',
@level2type=N'COLUMN',
@level2name=N'fecha_alta_medica'
EXEC sys.sp_addextendedproperty
@name=N'Descripcion',
@value=N'Indica las observaciones relacionadas al alta médica',
@level0type=N'SCHEMA',
@level0name=N'tps',
@level1type=N'TABLE',
@level1name=N'Siniestros_Altas_Medicas',
@level2type=N'COLUMN',
@level2name=N'observaciones'
EXEC sys.sp_addextendedproperty
@name=N'Descripcion',
@value=N'Indica el medico que otorgo el alta médica',
@level0type=N'SCHEMA',
@level0name=N'tps',
@level1type=N'TABLE',
@level1name=N'Siniestros_Altas_Medicas',
@level2type=N'COLUMN',
@level2name=N'medico'
--Campos Auditoria
EXEC sys.sp_addextendedproperty
@name=N'Descripcion',
@value=N'Fecha de alta del registro',
@level0type=N'SCHEMA',
@level0name=N'tps',
@level1type=N'TABLE',
@level1name=N'Siniestros_Altas_Medicas',
@level2type=N'COLUMN',
@level2name=N'fecha_alta_registro'
EXEC sys.sp_addextendedproperty
@name=N'Descripcion',
@value=N'Legajo de alta del registro',
@level0type=N'SCHEMA',
@level0name=N'tps',
@level1type=N'TABLE',
@level1name=N'Siniestros_Altas_Medicas',
@level2type=N'COLUMN',
@level2name=N'legajo_alta_registro'
EXEC sys.sp_addextendedproperty
@name=N'Descripcion',
@value=N'Fecha de modificación del registro',
@level0type=N'SCHEMA',
@level0name=N'tps',
@level1type=N'TABLE',
@level1name=N'Siniestros_Altas_Medicas',
@level2type=N'COLUMN',
@level2name=N'fecha_modificacion_registro'
EXEC sys.sp_addextendedproperty
@name=N'Descripcion',
@value=N'Legajo de modificación del registro',
@level0type=N'SCHEMA',
@level0name=N'tps',
@level1type=N'TABLE',
@level1name=N'Siniestros_Altas_Medicas',
@level2type=N'COLUMN',
@level2name=N'lejajo_modificacion_registro'
EXEC sys.sp_addextendedproperty
@name=N'Descripcion',
@value=N'Fecha de baja del registro',
@level0type=N'SCHEMA',
@level0name=N'tps',
@level1type=N'TABLE',
@level1name=N'Siniestros_Altas_Medicas',
@level2type=N'COLUMN',
@level2name=N'fecha_baja_registro'
EXEC sys.sp_addextendedproperty
@name=N'Descripcion',
@value=N'Legajo de baja del registro',
@level0type=N'SCHEMA',
@level0name=N'tps',
@level1type=N'TABLE',
@level1name=N'Siniestros_Altas_Medicas',
@level2type=N'COLUMN',
@level2name=N'lejajo_baja_registro'
Ejercicio 6
Documentación Relacionada: Lección 11 - Procedimientos Almacenados (Stored Procedures)
En base a la nueva tabla que se creó en el ejercicio 5, necesitamos crear un Procedimiento Almacenado que se encargue la de inserción de un nuevo
registro.
Recuerde utilizar el Template para la creación de Procedimientos Almacenados además de seguir las Buenas Prácticas y Lineamientos comentados
durante el taller.
En el nombre del Sp, indique el usuario del participante delante, por ej. tps.jperez_usp_iXXXXXXXXXXX.
Una vez creado el SP realice la compilación del mismo y ejecútelo para registrar un alta médica para los siniestro 2139466 (id= 97) y 2139457 (id=88),
USE ARTBD01
GO
CREATE PROCEDURE [tps].[usp_iSiniestroAltaMedica]
@pn_IdSiniestro INT,
@pd_FechaAltaMedica SMALLDATETIME,
@pc_Observaciones VARCHAR(MAX),
@pc_Medico VARCHAR(500),
@pn_LegajoAltaRegistro INT,
@pno_IdInsertado INT OUTPUT
AS
BEGIN
/******************************************************************
* Autor: PEREZ JUAN
* Fecha Creacion: 11/08/2020
* Requerimiento: TALLER SQL INTERMEDIO
* Descripcion: SP QUE REALIZA LA INSERCION DE UN ALTA MEDICA NUEVA
******************************************************************/
SET NOCOUNT ON;
-- La siguiente sentencia reemplaza el uso de NOLOCK en operaciones SELECT
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
BEGIN TRY
INSERT INTO tps.Siniestros_Altas_Medicas (id_siniestro,fecha_alta_medica,observaciones,
medico,legajo_alta_registro)
VALUES (@pn_IdSiniestro, @pd_FechaAltaMedica,@pc_Observaciones,@pc_Medico,
@pn_LegajoAltaRegistro)
-- Almaceno en el parametro tipo OUTPUT, el valor del id insertado en la tabla
SET @pno_IdInsertado = SCOPE_IDENTITY()
END TRY
BEGIN CATCH
DECLARE @vc_MensajeError NVARCHAR(2048),
@vn_GravedadError INT,
@vn_EstadoError INT,
@vn_NumeroError INT,
@vc_ProcedimientoError NVARCHAR(126),
@vn_LineaError INT
-- Obtengo los distintos valores asociados al error
SELECT @vc_MensajeError = ERROR_MESSAGE(),
@vn_GravedadError = ERROR_SEVERITY(),
@vn_EstadoError = ERROR_STATE(),
@vn_NumeroError = ERROR_NUMBER(),
@vc_ProcedimientoError = ISNULL(ERROR_PROCEDURE(),OBJECT_NAME(@@PROCID)),
@vn_LineaError = ERROR_LINE()
-- Inserto el error en la tabla de errores dbo.Errores_Procedimientos
EXEC dbo.usp_iErrorProcedimiento
@pc_MensajeError = @vc_MensajeError,
@pn_GravedadError = @vn_GravedadError,
@pn_EstadoError = @vn_EstadoError,
@pn_NumeroError = @vn_NumeroError,
@pc_ProcedimientoError = @vc_ProcedimientoError,
@pn_LineaError = @vn_LineaError
-- Retorno el error
RAISERROR (@vc_MensajeError,
@vn_GravedadError,
@vn_EstadoError);
END CATCH
END
GO
DECLARE
@vc_PropertyName VARCHAR(256),
@vc_StoreProcedureName VARCHAR(256) = N'usp_iSiniestroAltaMedica',
@vc_SchemaType VARCHAR(256) = N'SCHEMA',
@vc_Type VARCHAR(256) = N'PROCEDURE',
@vc_SchemaName VARCHAR(256) = N'tps',
@vc_PropertyDescription VARCHAR(256)
--DESCRIPCION SP
SET @vc_PropertyName = N'Descripcion'
SET @vc_PropertyDescription = N'Realiza la inserción de una nueva Alta Médica'
IF EXISTS (SELECT TOP 1 * FROM fn_listextendedproperty(@vc_PropertyName, @vc_SchemaType, @vc_SchemaName,
@vc_Type, @vc_StoreProcedureName, NULL, NULL))
BEGIN
EXEC sp_dropextendedproperty
@level0type = @vc_SchemaType,
@name = @vc_PropertyName,
@level0name = @vc_SchemaName,
@level1type = @vc_Type ,
@level1name = @vc_StoreProcedureName
END
EXEC sys.sp_addextendedproperty
@name = @vc_PropertyName,
@value = @vc_PropertyDescription,
@level0type = @vc_SchemaType,
@level0name = @vc_SchemaName,
@level1type = @vc_Type,
@level1name = @vc_StoreProcedureName;
--RETORNO
SET @vc_PropertyName = N'Retorno'
SET @vc_PropertyDescription = N'Retorna el id insertado correspondiente a la nueva alta'
IF EXISTS (SELECT TOP 1 * FROM fn_listextendedproperty(@vc_PropertyName, @vc_SchemaType, @vc_SchemaName,
@vc_Type, @vc_StoreProcedureName, NULL, NULL))
BEGIN
EXEC sp_dropextendedproperty
@level0type = @vc_SchemaType,
@name = @vc_PropertyName,
@level0name = @vc_SchemaName,
@level1type = @vc_Type,
@level1name = @vc_StoreProcedureName
END
EXEC sys.sp_addextendedproperty
@name = @vc_PropertyName,
@value = @vc_PropertyDescription,
@level0type = @vc_SchemaType,
@level0name = @vc_SchemaName,
@level1type = @vc_Type,
@level1name = @vc_StoreProcedureName;
--PARAMETROS (se debe agregar una property por parametro)
SET @vc_PropertyName = N'@pn_IdSiniestro'
SET @vc_PropertyDescription = N'TIPO: {INT} | REQUERIDO: {SI} | DEFAULT: {NO} | OUTPUT: {NO} -
DESCRIPCION: Id correspondiente a la tabla tps.Siniestros '
IF EXISTS (SELECT TOP 1 * FROM fn_listextendedproperty(@vc_PropertyName, @vc_SchemaType, @vc_SchemaName,
@vc_Type, @vc_StoreProcedureName, NULL, NULL))
BEGIN
EXEC sp_dropextendedproperty
@level0type = @vc_SchemaType,
@name = @vc_PropertyName,
@level0name = @vc_SchemaName,
@level1type = @vc_Type,
@level1name = @vc_StoreProcedureName
END
EXEC sys.sp_addextendedproperty
@name = @vc_PropertyName,
@value = @vc_PropertyDescription,
@level0type = @vc_SchemaType,
@level0name = @vc_SchemaName,
@level1type = @vc_Type,
@level1name = @vc_StoreProcedureName;
SET @vc_PropertyName = N'@pd_FechaAltaMedica'
SET @vc_PropertyDescription = N'TIPO: {SMALLDATETIME} | REQUERIDO: {SI} | DEFAULT: {NO} | OUTPUT: {NO} -
DESCRIPCION: Indica la Fecha en que se otorgo el Alta Médica'
IF EXISTS (SELECT TOP 1 * FROM fn_listextendedproperty(@vc_PropertyName, @vc_SchemaType, @vc_SchemaName,
@vc_Type, @vc_StoreProcedureName, NULL, NULL))
BEGIN
EXEC sp_dropextendedproperty
@level0type = @vc_SchemaType,
@name = @vc_PropertyName,
@level0name = @vc_SchemaName,
@level1type = @vc_Type,
@level1name = @vc_StoreProcedureName
END
EXEC sys.sp_addextendedproperty
@name = @vc_PropertyName,
@value = @vc_PropertyDescription,
@level0type = @vc_SchemaType,
@level0name = @vc_SchemaName,
@level1type = @vc_Type,
@level1name = @vc_StoreProcedureName;
SET @vc_PropertyName = N'@pc_Observaciones'
SET @vc_PropertyDescription = N'TIPO: {VARCHAR(500)} | REQUERIDO: {SI} | DEFAULT: {NO} | OUTPUT: {NO} -
DESCRIPCION: Observaciones correspondiente al Alta Médica'
IF EXISTS (SELECT TOP 1 * FROM fn_listextendedproperty(@vc_PropertyName, @vc_SchemaType, @vc_SchemaName,
@vc_Type, @vc_StoreProcedureName, NULL, NULL))
BEGIN
EXEC sp_dropextendedproperty
@level0type = @vc_SchemaType,
@name = @vc_PropertyName,
@level0name = @vc_SchemaName,
@level1type = @vc_Type,
@level1name = @vc_StoreProcedureName
END
EXEC sys.sp_addextendedproperty
@name = @vc_PropertyName,
@value = @vc_PropertyDescription,
@level0type = @vc_SchemaType,
@level0name = @vc_SchemaName,
@level1type = @vc_Type,
@level1name = @vc_StoreProcedureName;
SET @vc_PropertyName = N'@pc_Medico'
SET @vc_PropertyDescription = N'TIPO: {VARCHAR(500)} | REQUERIDO: {SI} | DEFAULT: {NO} | OUTPUT: {NO} -
DESCRIPCION: Apellido y Nombre del Médico que otorgo el Alta Médica '
IF EXISTS (SELECT TOP 1 * FROM fn_listextendedproperty(@vc_PropertyName, @vc_SchemaType, @vc_SchemaName,
@vc_Type, @vc_StoreProcedureName, NULL, NULL))
BEGIN
EXEC sp_dropextendedproperty
@level0type = @vc_SchemaType,
@name = @vc_PropertyName,
@level0name = @vc_SchemaName,
@level1type = @vc_Type,
@level1name = @vc_StoreProcedureName
END
EXEC sys.sp_addextendedproperty
@name = @vc_PropertyName,
@value = @vc_PropertyDescription,
@level0type = @vc_SchemaType,
@level0name = @vc_SchemaName,
@level1type = @vc_Type,
@level1name = @vc_StoreProcedureName;
SET @vc_PropertyName = N'@pn_LegajoAltaRegistro'
SET @vc_PropertyDescription = N'TIPO: {INT} | REQUERIDO: {SI} | DEFAULT: {NO} | OUTPUT: {NO} -
DESCRIPCION: Legajo del Usuario que cargo el Alta Médica'
IF EXISTS (SELECT TOP 1 * FROM fn_listextendedproperty(@vc_PropertyName, @vc_SchemaType, @vc_SchemaName,
@vc_Type, @vc_StoreProcedureName, NULL, NULL))
BEGIN
EXEC sp_dropextendedproperty
@level0type = @vc_SchemaType,
@name = @vc_PropertyName,
@level0name = @vc_SchemaName,
@level1type = @vc_Type,
@level1name = @vc_StoreProcedureName
END
EXEC sys.sp_addextendedproperty
@name = @vc_PropertyName,
@value = @vc_PropertyDescription,
@level0type = @vc_SchemaType,
@level0name = @vc_SchemaName,
@level1type = @vc_Type,
@level1name = @vc_StoreProcedureName;
SET @vc_PropertyName = N'@pno_IdInsertado'
SET @vc_PropertyDescription = N'TIPO: {INT} | REQUERIDO: {SI} | DEFAULT: {NO} | OUTPUT: {SI} -
DESCRIPCION: Devuelve el Id del registro insertado.'
IF EXISTS (SELECT TOP 1 * FROM fn_listextendedproperty(@vc_PropertyName, @vc_SchemaType, @vc_SchemaName,
@vc_Type, @vc_StoreProcedureName, NULL, NULL))
BEGIN
EXEC sp_dropextendedproperty
@level0type = @vc_SchemaType,
@name = @vc_PropertyName,
@level0name = @vc_SchemaName,
@level1type = @vc_Type,
@level1name = @vc_StoreProcedureName
END
EXEC sys.sp_addextendedproperty
@name = @vc_PropertyName,
@value = @vc_PropertyDescription,
@level0type = @vc_SchemaType,
@level0name = @vc_SchemaName,
@level1type = @vc_Type,
@level1name = @vc_StoreProcedureName;
Ejercicio 7
Documentación Relacionada: Lección 6 - Vistas
Se necesita crear una vista Personas la cual debe contener los siguientes campos:
Id de la Tabla tps.Personas
Documento
Apellido
Nombre
Sexo
Celular
Correo Electrónico
Nombre Calle Domicilio
Numero Calle Domicilio
Código Postal
Nombre Localidad
Nombre Provincia
Recuerde seguir las Buenas Prácticas y Lineamientos comentados durante el taller.
En el nombre de la vista, indique el usuario del participante delante, por ej. tps.jperez_v_XXXXXXXXXXX.
Tenga en cuenta que existen personas que pueden no tener datos cargados de domiclios.
CREATE VIEW [tps].[v_Personas]
AS
SELECT p.id,
p.documento_persona,
p.apellido,
p.nombre,
s.descripcion as sexo,
p.celular,
p.correo_electronico,
pd.nombre_calle,
pd.numero_calle,
l.codigo_postal,
l.nombre_localidad,
pr.nombre_provincia
FROM tps.Personas p (NOLOCK)
INNER JOIN tps.Sexos s (NOLOCK)
ON p.id_sexo = s.id
LEFT JOIN tps.Personas_Domicilios pd (NOLOCK)
ON p.id = pd.id_persona
LEFT JOIN tps.Localidades l (NOLOCK)
ON pd.id_localidad = l.id
LEFT JOIN tps.Provincias pr (NOLOCK)
ON l.id_provincia = pr.id
GO
Ejercicio 8
Documentación Relacionada: Lección 12 - Sentencias de Control de Flujo
Se necesita obtener un listado de empresas con su respectiva cantidad de empleados asegurados.
El mismo debe estar ordenado por Numero de Contrato y contener los siguientes campos:
Numero de Contrato
Razón Social
Cantidad de Empleados
Si es menor a 100, mostrar 'Menos de 100 empleados'
Si es mayor a 100 y menor a 500, mostrar ' Entre 100 y 500 empleados'
Si es mayor a 500, mostrar 'Más de 500 empleados'
Código Postal
Nombre de Localidad
Nombre Provincia
SELECT e.numero_contrato,
e.razon_social,
CASE WHEN e.cantidad_empleados < 100 THEN 'Menos de 100 empleados'
WHEN e.cantidad_empleados > 100 AND e.cantidad_empleados < 500 THEN 'Entre 100 y 500
empleados'
WHEN e.cantidad_empleados > 500 THEN 'Más de 500 empleados'
ELSE '' END AS cantidad_empleados,
l.codigo_postal,
l.nombre_localidad,
p.nombre_provincia
FROM tps.Empresas e (NOLOCK)
INNER JOIN tps.Localidades l (NOLOCK)
ON e.id_localidad = l.id
INNER JOIN tps.Provincias p (NOLOCK)
ON l.id_provincia = p.id
ORDER BY e.numero_contrato
Ejercicio 9
Documentación Relacionada: Lección 15 - Cross Apply / Outher Apply (CROSS APPLY)
Se necesita generar un listado el cual contenga los siniestros y datos relacionados al primer CIE10 asignado que tuvieron.
El reporte debe contar con las siguientes columnas:
Siniestro
CIE10
Descripción del CIE10
Fecha Asignación del CIE10
SELECT s.siniestro,
scdc.cie10,
scdc.descripcion,
scdc.fecha_alta_registro
FROM tps.Siniestros s(NOLOCK)
CROSS APPLY( SELECT TOP 1 scdc.id, scdc.id_codigo_diagnostico_cie10, cdc.cie10, cdc.descripcion, scdc.
fecha_alta_registro
FROM tps.Siniestros_Codigos_Diagnostico_CIE10 scdc (NOLOCK)
INNER JOIN tps.Codigos_Diagnostico_CIE10 cdc (NOLOCK)
ON scdc.id_codigo_diagnostico_cie10 = cdc.id
WHERE scdc.id_siniestro = s.id
ORDER BY scdc.fecha_alta_registro DESC) scdc