Select con campos calculados

11/01/2006 - 14:49 por Fabián | Informe spam
Hola, tengo un inconveniente con una consulta, y no se por donde controlar.
¿Alguien me puede dar alguna sugerencia?
El tema es que tengo que hacer un resumen de las validaciones que han
realizado algunos medicos para su posterior pago.
Lo que tengo que obtener como resultado es
Año, mes, medico, cantidad, P15, A2
G4 DIF
2005 12 10331 23 8 19 19 15
En realidad hay que pagarle al médico 15 validaciones por que las reglas de
negocios dicen que:
1 medico no puede atender mas de 15 veces por día, no puede atender a un
mismo afiliado mas de 2 veces por día y no puede atender a un mismo grupo
familiar mas de 4 veces por día.
y lo que obtengo como resultado actualmente es esto.
Año, mes, medico, cantidad, P15, A2
G4 DIF
2005 12 10331 23 80 110 190 -357


A continuación les paso los scripts de creación de la tabla y las consultas.


/*SCRIPT PARA LA CREACION DE LA TABLA*/
if exists (select * from dbo.sysobjects where id =
object_id(N'[dbo].[RESUMEN1]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[RESUMEN1]
GO

CREATE TABLE [dbo].[RESUMEN1] (
[AÑO] [int] NULL ,
[MES] [int] NULL ,
[DIA] [int] NULL ,
[MEDICO] [varchar] (20) COLLATE SQL_Latin1_General_CP850_CI_AS NULL ,
[AFILIADO] [varchar] (30) COLLATE SQL_Latin1_General_CP850_CI_AS NULL ,
[PRACTICA] [varchar] (20) COLLATE SQL_Latin1_General_CP850_CI_AS NULL ,
[CANTIDAD] [int] NULL
) ON [PRIMARY]
GO

INSERT INTO RESUMEN1 (AÑO,MES,DIA,MEDICO,AFILIADO,CANTIDAD) VALUES
(2005,12,1,'10331','123456789013',1)
GO
INSERT INTO RESUMEN1 (AÑO,MES,DIA,MEDICO,AFILIADO,CANTIDAD) VALUES
(2005,12,1,'10331','123456789013',4)
GO
INSERT INTO RESUMEN1 (AÑO,MES,DIA,MEDICO,AFILIADO,CANTIDAD) VALUES
(2005,12,1,'10331','123456789013',11)
GO
INSERT INTO RESUMEN1 (AÑO,MES,DIA,MEDICO,AFILIADO,CANTIDAD) VALUES
(2005,12,1,'10331','123456789013',1)
GO
INSERT INTO RESUMEN1 (AÑO,MES,DIA,MEDICO,AFILIADO,CANTIDAD) VALUES
(2005,12,1,'10331','123456789013',1)
GO
INSERT INTO RESUMEN1 (AÑO,MES,DIA,MEDICO,AFILIADO,CANTIDAD) VALUES
(2005,12,1,'10331','123456789013',1)
GO
INSERT INTO RESUMEN1 (AÑO,MES,DIA,MEDICO,AFILIADO,CANTIDAD) VALUES
(2005,12,1,'10331','123456789012',1)
GO
INSERT INTO RESUMEN1 (AÑO,MES,DIA,MEDICO,AFILIADO,CANTIDAD) VALUES
(2005,12,1,'10331','123456789012',1)
GO
INSERT INTO RESUMEN1 (AÑO,MES,DIA,MEDICO,AFILIADO,CANTIDAD) VALUES
(2005,12,1,'10331','123456789012',1)
GO
INSERT INTO RESUMEN1 (AÑO,MES,DIA,MEDICO,AFILIADO,CANTIDAD) VALUES
(2005,12,1,'10331','123456789012',1)
GO

/*CONSULTA DE SELECCION */
SELECT
R.AÑO,R.MES,R.MEDICO
,SUM(CANTIDAD) AS CANTIDAD
,SUM(P15) AS P15
,SUM(A2) AS A2
,SUM(G4) AS G4
,TOTAL=(SUM(CANTIDAD)-SUM(P15)-SUM(A2)-SUM(G4))
FROM RESUMEN1 R
LEFT OUTER JOIN
/*
CON ESTA SUBCONSULTA DEVUELVO LOS MÉDICOS QUE HAN ATENDIDO MAS DE
15 AFILIADOS EN UN MISMO DÍA. SE TIENE QUE DEBITAR PERO TENGO QUE TENER EN
CUENTA TAMBIEN LAS DOS CONDICIONES QUE SIGUEN A CONTINUACION.
*/
(SELECT AÑO,MES,DIA,MEDICO,SUM(CANTIDAD)-15 AS P15
FROM RESUMEN1
GROUP BY AÑO,MES,DIA,MEDICO
HAVING SUM(CANTIDAD) >15)AS E
ON R.AÑO=E.AÑO AND R.MES=E.MES AND R.DIA=E.DIA AND R.MEDICO = E.MEDICO
LEFT OUTER JOIN
/*
CON ESTA SUBCONSULTA DEVUELVO LOS MÉDICOS QUE HAN ATENDIDO 2 VECES
EN UN MISMO DÍA A UN MISMO AFILIADO. ESTO SE TIENE QUE DEBITAR
*/
(SELECT AÑO,MES,DIA,MEDICO,AFILIADO,SUM(CANTIDAD)-2 AS A2
FROM RESUMEN1
GROUP BY AÑO,MES,DIA,MEDICO,AFILIADO
HAVING SUM(CANTIDAD) >2)AS C
ON
R.AÑO=C.AÑO
AND
R.MES=C.MES
AND
R.DIA=C.DIA
AND
R.MEDICO = C.MEDICO
AND
R.AFILIADO = C.AFILIADO

LEFT OUTER JOIN
/*
CON ESTA SUBCONSULTA DEVUELVO LOS MÉDICOS QUE HAN ATENDIDO MAS DE 4 VECES
A UN MISMO GRUPO FAMILIAR. ESTO SE TIENE QUE DEBITAR
*/
(SELECT AÑO,MES,DIA,MEDICO,SUBSTRING(AFILIADO,1,9)AFILIADO,SUM(CANTIDAD)-4
AS G4
FROM RESUMEN1
GROUP BY AÑO,MES,DIA,MEDICO,SUBSTRING(AFILIADO,1,9)
HAVING SUM(CANTIDAD) >4)AS D
ON
R.AÑO=D.AÑO
AND
R.MES=D.MES
AND
R.DIA=D.DIA
AND
R.MEDICO = D.MEDICO
AND
SUBSTRING(R.AFILIADO,1,9) = SUBSTRING(D.AFILIADO,1,9)

WHERE R.MEDICO331
GROUP BY R.AÑO,R.MES,R.MEDICO
ORDER BY R.MEDICO
GO
/***************************************************************************
CONSULTAS DE CONTROL PARA VERIFICAR LOS RESULTADOS
****************************************************************************/

SELECT AÑO,MES,DIA,MEDICO,AFILIADO,SUM(CANTIDAD)-2 AS A2
FROM RESUMEN1
WHERE MEDICO331
GROUP BY AÑO,MES,DIA,MEDICO,AFILIADO
HAVING SUM(CANTIDAD) >2
GO
SELECT AÑO,MES,DIA,MEDICO,SUBSTRING(AFILIADO,1,9)AFILIADO,SUM(CANTIDAD)-4 AS
G4
FROM RESUMEN1
WHERE MEDICO331
GROUP BY AÑO,MES,DIA,MEDICO,SUBSTRING(AFILIADO,1,9)
HAVING SUM(CANTIDAD) >4
GO

SELECT AÑO, MES,DIA, MEDICO, SUM(CANTIDAD)-15 AS P15
FROM RESUMEN1
WHERE MEDICO331
GROUP BY AÑO, MES, DIA, MEDICO
HAVING SUM(CANTIDAD)>15
ORDER BY MEDICO
GO
SELECT AÑO, MES,DIA, MEDICO,AFILIADO, SUM(CANTIDAD)CANTIDAD
FROM RESUMEN1
WHERE MEDICO = 10331
GROUP BY AÑO, MES,DIA, MEDICO,AFILIADO
ORDER BY MEDICO
GO
Saludos
Fabián
 

Leer las respuestas

#1 Fabián
12/01/2006 - 05:19 | Informe spam
Me contesto a mi mismo.
Este tema lo solucione creando tablas temporales en el store procedure.


"Fabián" escribió:

Hola, tengo un inconveniente con una consulta, y no se por donde controlar.
¿Alguien me puede dar alguna sugerencia?
El tema es que tengo que hacer un resumen de las validaciones que han
realizado algunos medicos para su posterior pago.
Lo que tengo que obtener como resultado es
Año, mes, medico, cantidad, P15, A2
G4 DIF
2005 12 10331 23 8 19 19 15
En realidad hay que pagarle al médico 15 validaciones por que las reglas de
negocios dicen que:
1 medico no puede atender mas de 15 veces por día, no puede atender a un
mismo afiliado mas de 2 veces por día y no puede atender a un mismo grupo
familiar mas de 4 veces por día.
y lo que obtengo como resultado actualmente es esto.
Año, mes, medico, cantidad, P15, A2
G4 DIF
2005 12 10331 23 80 110 190 -357


A continuación les paso los scripts de creación de la tabla y las consultas.


/*SCRIPT PARA LA CREACION DE LA TABLA*/
if exists (select * from dbo.sysobjects where id =
object_id(N'[dbo].[RESUMEN1]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[RESUMEN1]
GO

CREATE TABLE [dbo].[RESUMEN1] (
[AÑO] [int] NULL ,
[MES] [int] NULL ,
[DIA] [int] NULL ,
[MEDICO] [varchar] (20) COLLATE SQL_Latin1_General_CP850_CI_AS NULL ,
[AFILIADO] [varchar] (30) COLLATE SQL_Latin1_General_CP850_CI_AS NULL ,
[PRACTICA] [varchar] (20) COLLATE SQL_Latin1_General_CP850_CI_AS NULL ,
[CANTIDAD] [int] NULL
) ON [PRIMARY]
GO

INSERT INTO RESUMEN1 (AÑO,MES,DIA,MEDICO,AFILIADO,CANTIDAD) VALUES
(2005,12,1,'10331','123456789013',1)
GO
INSERT INTO RESUMEN1 (AÑO,MES,DIA,MEDICO,AFILIADO,CANTIDAD) VALUES
(2005,12,1,'10331','123456789013',4)
GO
INSERT INTO RESUMEN1 (AÑO,MES,DIA,MEDICO,AFILIADO,CANTIDAD) VALUES
(2005,12,1,'10331','123456789013',11)
GO
INSERT INTO RESUMEN1 (AÑO,MES,DIA,MEDICO,AFILIADO,CANTIDAD) VALUES
(2005,12,1,'10331','123456789013',1)
GO
INSERT INTO RESUMEN1 (AÑO,MES,DIA,MEDICO,AFILIADO,CANTIDAD) VALUES
(2005,12,1,'10331','123456789013',1)
GO
INSERT INTO RESUMEN1 (AÑO,MES,DIA,MEDICO,AFILIADO,CANTIDAD) VALUES
(2005,12,1,'10331','123456789013',1)
GO
INSERT INTO RESUMEN1 (AÑO,MES,DIA,MEDICO,AFILIADO,CANTIDAD) VALUES
(2005,12,1,'10331','123456789012',1)
GO
INSERT INTO RESUMEN1 (AÑO,MES,DIA,MEDICO,AFILIADO,CANTIDAD) VALUES
(2005,12,1,'10331','123456789012',1)
GO
INSERT INTO RESUMEN1 (AÑO,MES,DIA,MEDICO,AFILIADO,CANTIDAD) VALUES
(2005,12,1,'10331','123456789012',1)
GO
INSERT INTO RESUMEN1 (AÑO,MES,DIA,MEDICO,AFILIADO,CANTIDAD) VALUES
(2005,12,1,'10331','123456789012',1)
GO

/*CONSULTA DE SELECCION */
SELECT
R.AÑO,R.MES,R.MEDICO
,SUM(CANTIDAD) AS CANTIDAD
,SUM(P15) AS P15
,SUM(A2) AS A2
,SUM(G4) AS G4
,TOTAL=(SUM(CANTIDAD)-SUM(P15)-SUM(A2)-SUM(G4))
FROM RESUMEN1 R
LEFT OUTER JOIN
/*
CON ESTA SUBCONSULTA DEVUELVO LOS MÉDICOS QUE HAN ATENDIDO MAS DE
15 AFILIADOS EN UN MISMO DÍA. SE TIENE QUE DEBITAR PERO TENGO QUE TENER EN
CUENTA TAMBIEN LAS DOS CONDICIONES QUE SIGUEN A CONTINUACION.
*/
(SELECT AÑO,MES,DIA,MEDICO,SUM(CANTIDAD)-15 AS P15
FROM RESUMEN1
GROUP BY AÑO,MES,DIA,MEDICO
HAVING SUM(CANTIDAD) >15)AS E
ON R.AÑO=E.AÑO AND R.MES=E.MES AND R.DIA=E.DIA AND R.MEDICO = E.MEDICO
LEFT OUTER JOIN
/*
CON ESTA SUBCONSULTA DEVUELVO LOS MÉDICOS QUE HAN ATENDIDO 2 VECES
EN UN MISMO DÍA A UN MISMO AFILIADO. ESTO SE TIENE QUE DEBITAR
*/
(SELECT AÑO,MES,DIA,MEDICO,AFILIADO,SUM(CANTIDAD)-2 AS A2
FROM RESUMEN1
GROUP BY AÑO,MES,DIA,MEDICO,AFILIADO
HAVING SUM(CANTIDAD) >2)AS C
ON
R.AÑO=C.AÑO
AND
R.MES=C.MES
AND
R.DIA=C.DIA
AND
R.MEDICO = C.MEDICO
AND
R.AFILIADO = C.AFILIADO

LEFT OUTER JOIN
/*
CON ESTA SUBCONSULTA DEVUELVO LOS MÉDICOS QUE HAN ATENDIDO MAS DE 4 VECES
A UN MISMO GRUPO FAMILIAR. ESTO SE TIENE QUE DEBITAR
*/
(SELECT AÑO,MES,DIA,MEDICO,SUBSTRING(AFILIADO,1,9)AFILIADO,SUM(CANTIDAD)-4
AS G4
FROM RESUMEN1
GROUP BY AÑO,MES,DIA,MEDICO,SUBSTRING(AFILIADO,1,9)
HAVING SUM(CANTIDAD) >4)AS D
ON
R.AÑO=D.AÑO
AND
R.MES=D.MES
AND
R.DIA=D.DIA
AND
R.MEDICO = D.MEDICO
AND
SUBSTRING(R.AFILIADO,1,9) = SUBSTRING(D.AFILIADO,1,9)

WHERE R.MEDICO331
GROUP BY R.AÑO,R.MES,R.MEDICO
ORDER BY R.MEDICO
GO
/***************************************************************************
CONSULTAS DE CONTROL PARA VERIFICAR LOS RESULTADOS
****************************************************************************/

SELECT AÑO,MES,DIA,MEDICO,AFILIADO,SUM(CANTIDAD)-2 AS A2
FROM RESUMEN1
WHERE MEDICO331
GROUP BY AÑO,MES,DIA,MEDICO,AFILIADO
HAVING SUM(CANTIDAD) >2
GO
SELECT AÑO,MES,DIA,MEDICO,SUBSTRING(AFILIADO,1,9)AFILIADO,SUM(CANTIDAD)-4 AS
G4
FROM RESUMEN1
WHERE MEDICO331
GROUP BY AÑO,MES,DIA,MEDICO,SUBSTRING(AFILIADO,1,9)
HAVING SUM(CANTIDAD) >4
GO

SELECT AÑO, MES,DIA, MEDICO, SUM(CANTIDAD)-15 AS P15
FROM RESUMEN1
WHERE MEDICO331
GROUP BY AÑO, MES, DIA, MEDICO
HAVING SUM(CANTIDAD)>15
ORDER BY MEDICO
GO
SELECT AÑO, MES,DIA, MEDICO,AFILIADO, SUM(CANTIDAD)CANTIDAD
FROM RESUMEN1
WHERE MEDICO = 10331
GROUP BY AÑO, MES,DIA, MEDICO,AFILIADO
ORDER BY MEDICO
GO
Saludos
Fabián

Preguntas similares