Se puede hacer select si?

14/01/2006 - 17:01 por Fabián | Informe spam
Hola compañeros, tengo una pregunta que a lo mejor es básica.
Pero no se como hacerla T-SQL
Sí A >2 y G>4 y P>15 entonces X=X-(A+G+P)
o
Sí A >2 y G<4 y P<15 entonces X=X-(A)
Espero que me haya explicado.
Ej.:
XR,
A=8,
P)
entonces x= 52-(6+14) y el resultado sería x2

Desde ya muchas gracias.
Fabián

Preguntas similare

Leer las respuestas

#6 Fabián
15/01/2006 - 00:52 | Informe spam
Alejandro,
Te comento la tabla resumen1 tiene las validaciones de prestaciones de un
médico. El tema es que tengo que evaluar las siguientes cosas.
El médico no puede atender al mismo afiliado > 2 veces por día. Esto sería A2

El médico no puede atender al mismo grupo de afiliado >4 veces por día. Esto
G4

Y el médico no puede atender >15 cantidades por día. Esto P15
Entonces al campo cantidad de alguna forma tengo que restarle el excedente
de >2 y si corresponde restarle el excedente de >4 y si corresponde el
excedente de >15

Estuve intentando con tablas temporales, con left join
Pero no me sale.
Desde ya muchas gracias.
Y espero haberme echo entender.

"Alejandro Mesa" escribió:

Fabián,

Creo que mejor pones un ejemplo de la tabla, data y resultado esperado. Es
muy dificil entender lo que se quiere hacer cuando la descripcion del
problema se da de poquito en poquito.

1 -

Quien es X en todo este asunto?

2 -

Por que usas un alias igual al nombre de una columna?

> select a,b,sum(cantidad) AS A from tabla group by a,b having A>2

3 -

Por que filtras en la clausula "having" y no en la clausula "where", si solo
queires ciertos valores de la columna [A]?

> select a,b,sum(cantidad) AS g from tabla group by a,b having A>4
> select a,b,sum(cantidad) AS p from tabla group by a,b having A>15


AMB

"Fabián" wrote:

> Hola, estos valores salen de una misma tabla y de un mismo campo. Que es el
> campo cantidad. Lo que pasa es que los valores son group by.
> Por ejemplo
> select a,b,sum(cantidad) AS A from tabla group by a,b having A>2
> select a,b,sum(cantidad) AS g from tabla group by a,b having A>4
> select a,b,sum(cantidad) AS p from tabla group by a,b having A>15
> Gracias
>
>
> "Alejandro Mesa" escribió:
>
> > Fabián,
> >
> > De donde salen los valores a los que te refieres, desde una tabla o son
> > valores de variables?
> >
> > T-SQL cuenta con una expresion muy interesante y util llamada "case".
> >
> > select
> > case
> > when A > 2 and G > 4 and P > 15 then X - (A + G + P)
> > when A > 2 and G < 4 and P < 15 then X - A
> > else NULL -- que pasa si no se cumplen los criterios anteriores
> > end as X
> > from
> > t1
> > go
> >
> > Si la formula referencia variables, entonces puedes una sentencia "if".
> >
> > if (@A > 2 and @G > 4 and @P > 15) set @X = @X - (@A + @G + @P)
> > if (@A > 2 and @G < 4 and @P < 15) set @X = @X - @A
> >
> >
> > AMB
> >
> >
> > "Fabián" wrote:
> >
> > > Hola compañeros, tengo una pregunta que a lo mejor es básica.
> > > Pero no se como hacerla T-SQL
> > > Sí A >2 y G>4 y P>15 entonces X=X-(A+G+P)
> > > o
> > > Sí A >2 y G<4 y P<15 entonces X=X-(A)
> > > Espero que me haya explicado.
> > > Ej.:
> > > XR,
> > > A=8,
> > > P)
> > > entonces x= 52-(6+14) y el resultado sería x2
> > >
> > > Desde ya muchas gracias.
> > > Fabián
> > >
> > >
Respuesta Responder a este mensaje
#7 Alejandro Mesa
15/01/2006 - 05:32 | Informe spam
Fabián,

Año Mes Medico Cantidad
2005 12 10331 23



Los datos previos se entienden. Ahora explicanos de donde salen los valores:

P15 A2 G4
0 6 0




AMB

"Fabián" wrote:

Alejandro
Este es el script de creación de la tabla y la insercion de registros de
prueba
El resultado deseado es
Año Mes Medico Cantidad P15 A2 G4 Total
2005 12 10331 23 0 6 0 17


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

"Alejandro Mesa" escribió:

> Fabián,
>
> Creo que mejor pones un ejemplo de la tabla, data y resultado esperado. Es
> muy dificil entender lo que se quiere hacer cuando la descripcion del
> problema se da de poquito en poquito.
>
> 1 -
>
> Quien es X en todo este asunto?
>
> 2 -
>
> Por que usas un alias igual al nombre de una columna?
>
> > select a,b,sum(cantidad) AS A from tabla group by a,b having A>2
>
> 3 -
>
> Por que filtras en la clausula "having" y no en la clausula "where", si solo
> queires ciertos valores de la columna [A]?
>
> > select a,b,sum(cantidad) AS g from tabla group by a,b having A>4
> > select a,b,sum(cantidad) AS p from tabla group by a,b having A>15
>
>
> AMB
>
> "Fabián" wrote:
>
> > Hola, estos valores salen de una misma tabla y de un mismo campo. Que es el
> > campo cantidad. Lo que pasa es que los valores son group by.
> > Por ejemplo
> > select a,b,sum(cantidad) AS A from tabla group by a,b having A>2
> > select a,b,sum(cantidad) AS g from tabla group by a,b having A>4
> > select a,b,sum(cantidad) AS p from tabla group by a,b having A>15
> > Gracias
> >
> >
> > "Alejandro Mesa" escribió:
> >
> > > Fabián,
> > >
> > > De donde salen los valores a los que te refieres, desde una tabla o son
> > > valores de variables?
> > >
> > > T-SQL cuenta con una expresion muy interesante y util llamada "case".
> > >
> > > select
> > > case
> > > when A > 2 and G > 4 and P > 15 then X - (A + G + P)
> > > when A > 2 and G < 4 and P < 15 then X - A
> > > else NULL -- que pasa si no se cumplen los criterios anteriores
> > > end as X
> > > from
> > > t1
> > > go
> > >
> > > Si la formula referencia variables, entonces puedes una sentencia "if".
> > >
> > > if (@A > 2 and @G > 4 and @P > 15) set @X = @X - (@A + @G + @P)
> > > if (@A > 2 and @G < 4 and @P < 15) set @X = @X - @A
> > >
> > >
> > > AMB
> > >
> > >
> > > "Fabián" wrote:
> > >
> > > > Hola compañeros, tengo una pregunta que a lo mejor es básica.
> > > > Pero no se como hacerla T-SQL
> > > > Sí A >2 y G>4 y P>15 entonces X=X-(A+G+P)
> > > > o
> > > > Sí A >2 y G<4 y P<15 entonces X=X-(A)
> > > > Espero que me haya explicado.
> > > > Ej.:
> > > > XR,
> > > > A=8,
> > > > P)
> > > > entonces x= 52-(6+14) y el resultado sería x2
> > > >
> > > > Desde ya muchas gracias.
> > > > Fabián
> > > >
> > > >
Respuesta Responder a este mensaje
#8 Fabián
15/01/2006 - 05:58 | Informe spam
Alejandro,
> P15 A2 G4
> 0 6 0


Estos valores salen del control que hago a "mano",
A2 = 6
Significa que el mismo afiliado en el mismo día tuvo mas de 2 consultas.
Y en realidad sale del
select año,mes,dia,medico,afiliado, count(cantidad) cantidad from resumen1
group by año,mes,dia,medico,afiliado
2005 12 1 10331 123456789012 4
2005 12 1 10331 123456789013 6

Es lo que quiero conseguir, pero no se como hacerlo.
En teoría es el select dia,medico,sum(cantidad)-2 as A2 from resumen1 group
by dia,medico having sum(cantidad) >4.

G4=0
es el select dia,medico,substring(afiliado,1,9)as Grupo,sum(cantidad) as G4
from resumen1 group by dia,medico,substring(afiliado,1,9) having
sum(cantidad) >4
P15=0
es el select dia,medico,sum(cantidad) as P15 from resumen1 group by
dia,medico, having sum(cantidad) >15


"Alejandro Mesa" escribió:

Fabián,

> Año Mes Medico Cantidad
> 2005 12 10331 23

Los datos previos se entienden. Ahora explicanos de donde salen los valores:

> P15 A2 G4
> 0 6 0


AMB

"Fabián" wrote:

> Alejandro
> Este es el script de creación de la tabla y la insercion de registros de
> prueba
> El resultado deseado es
> Año Mes Medico Cantidad P15 A2 G4 Total
> 2005 12 10331 23 0 6 0 17
>
>
> 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
> 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
>
> "Alejandro Mesa" escribió:
>
> > Fabián,
> >
> > Creo que mejor pones un ejemplo de la tabla, data y resultado esperado. Es
> > muy dificil entender lo que se quiere hacer cuando la descripcion del
> > problema se da de poquito en poquito.
> >
> > 1 -
> >
> > Quien es X en todo este asunto?
> >
> > 2 -
> >
> > Por que usas un alias igual al nombre de una columna?
> >
> > > select a,b,sum(cantidad) AS A from tabla group by a,b having A>2
> >
> > 3 -
> >
> > Por que filtras en la clausula "having" y no en la clausula "where", si solo
> > queires ciertos valores de la columna [A]?
> >
> > > select a,b,sum(cantidad) AS g from tabla group by a,b having A>4
> > > select a,b,sum(cantidad) AS p from tabla group by a,b having A>15
> >
> >
> > AMB
> >
> > "Fabián" wrote:
> >
> > > Hola, estos valores salen de una misma tabla y de un mismo campo. Que es el
> > > campo cantidad. Lo que pasa es que los valores son group by.
> > > Por ejemplo
> > > select a,b,sum(cantidad) AS A from tabla group by a,b having A>2
> > > select a,b,sum(cantidad) AS g from tabla group by a,b having A>4
> > > select a,b,sum(cantidad) AS p from tabla group by a,b having A>15
> > > Gracias
> > >
> > >
> > > "Alejandro Mesa" escribió:
> > >
> > > > Fabián,
> > > >
> > > > De donde salen los valores a los que te refieres, desde una tabla o son
> > > > valores de variables?
> > > >
> > > > T-SQL cuenta con una expresion muy interesante y util llamada "case".
> > > >
> > > > select
> > > > case
> > > > when A > 2 and G > 4 and P > 15 then X - (A + G + P)
> > > > when A > 2 and G < 4 and P < 15 then X - A
> > > > else NULL -- que pasa si no se cumplen los criterios anteriores
> > > > end as X
> > > > from
> > > > t1
> > > > go
> > > >
> > > > Si la formula referencia variables, entonces puedes una sentencia "if".
> > > >
> > > > if (@A > 2 and @G > 4 and @P > 15) set @X = @X - (@A + @G + @P)
> > > > if (@A > 2 and @G < 4 and @P < 15) set @X = @X - @A
> > > >
> > > >
> > > > AMB
> > > >
> > > >
> > > > "Fabián" wrote:
> > > >
> > > > > Hola compañeros, tengo una pregunta que a lo mejor es básica.
> > > > > Pero no se como hacerla T-SQL
> > > > > Sí A >2 y G>4 y P>15 entonces X=X-(A+G+P)
> > > > > o
> > > > > Sí A >2 y G<4 y P<15 entonces X=X-(A)
> > > > > Espero que me haya explicado.
> > > > > Ej.:
> > > > > XR,
> > > > > A=8,
> > > > > P)
> > > > > entonces x= 52-(6+14) y el resultado sería x2
> > > > >
> > > > > Desde ya muchas gracias.
> > > > > Fabián
> > > > >
> > > > >
Respuesta Responder a este mensaje
#9 Alejandro Mesa
15/01/2006 - 18:42 | Informe spam
Fabián,

Seguimos por parte. Para A2 creo que podemos usar:

create view med
as
SELECT
AÑO,MES,DIA,MEDICO,
sum(cantidad) as sum_cantidad
FROM RESUMEN1
GROUP BY AÑO,MES,DIA,MEDICO
go

create view a2
as
select
AÑO,MES,DIA,MEDICO,
sum(cnt) as a2
from
(
SELECT
AÑO,MES,DIA,MEDICO,AFILIADO,
case when count(*) > 2 then count(*) - 2 else 0 end as cnt
FROM RESUMEN1
GROUP BY AÑO,MES,DIA,MEDICO,AFILIADO
) as t1
group by
AÑO,MES,DIA,MEDICO
go

select
r.*, c.a2
from
med as r
left outer join
a2 as c
ON R.AÑO=C.AÑO
AND R.MES=C.MES
AND R.DIA=C.DIA
AND R.MEDICO = C.MEDICO
go

drop view med, a2
go

Para G4 y P15, necesito indagar un poco mas, porque si ejecutamos las
siguientes sentencias sobre la data de ejemplo que posteastes, entonces:

select AÑO, mes, dia, medico,substring(afiliado,1,9)as Grupo, sum(cantidad)
as G4
from resumen1
group by AÑO, mes, dia, medico,substring(afiliado,1,9)
having sum(cantidad) > 4
go

Resultado:

AÑO mes dia medico Grupo G4

2005 12 1 10331 123456789 23

No se porque dices que G4 = 0. Lo mismo pasa con P15.


AMB

"Fabián" wrote:

Alejandro,
> > P15 A2 G4
> > 0 6 0
Estos valores salen del control que hago a "mano",
A2 = 6
Significa que el mismo afiliado en el mismo día tuvo mas de 2 consultas.
Y en realidad sale del
select año,mes,dia,medico,afiliado, count(cantidad) cantidad from resumen1
group by año,mes,dia,medico,afiliado
2005 12 1 10331 123456789012 4
2005 12 1 10331 123456789013 6

Es lo que quiero conseguir, pero no se como hacerlo.
En teoría es el select dia,medico,sum(cantidad)-2 as A2 from resumen1 group
by dia,medico having sum(cantidad) >4.

G4=0
es el select dia,medico,substring(afiliado,1,9)as Grupo,sum(cantidad) as G4
from resumen1 group by dia,medico,substring(afiliado,1,9) having
sum(cantidad) >4
P15=0
es el select dia,medico,sum(cantidad) as P15 from resumen1 group by
dia,medico, having sum(cantidad) >15


"Alejandro Mesa" escribió:

> Fabián,
>
> > Año Mes Medico Cantidad
> > 2005 12 10331 23
>
> Los datos previos se entienden. Ahora explicanos de donde salen los valores:
>
> > P15 A2 G4
> > 0 6 0
>
>
> AMB
>
> "Fabián" wrote:
>
> > Alejandro
> > Este es el script de creación de la tabla y la insercion de registros de
> > prueba
> > El resultado deseado es
> > Año Mes Medico Cantidad P15 A2 G4 Total
> > 2005 12 10331 23 0 6 0 17
> >
> >
> > 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
> > 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
> >
> > "Alejandro Mesa" escribió:
> >
> > > Fabián,
> > >
> > > Creo que mejor pones un ejemplo de la tabla, data y resultado esperado. Es
> > > muy dificil entender lo que se quiere hacer cuando la descripcion del
> > > problema se da de poquito en poquito.
> > >
> > > 1 -
> > >
> > > Quien es X en todo este asunto?
> > >
> > > 2 -
> > >
> > > Por que usas un alias igual al nombre de una columna?
> > >
> > > > select a,b,sum(cantidad) AS A from tabla group by a,b having A>2
> > >
> > > 3 -
> > >
> > > Por que filtras en la clausula "having" y no en la clausula "where", si solo
> > > queires ciertos valores de la columna [A]?
> > >
> > > > select a,b,sum(cantidad) AS g from tabla group by a,b having A>4
> > > > select a,b,sum(cantidad) AS p from tabla group by a,b having A>15
> > >
> > >
> > > AMB
> > >
> > > "Fabián" wrote:
> > >
> > > > Hola, estos valores salen de una misma tabla y de un mismo campo. Que es el
> > > > campo cantidad. Lo que pasa es que los valores son group by.
> > > > Por ejemplo
> > > > select a,b,sum(cantidad) AS A from tabla group by a,b having A>2
> > > > select a,b,sum(cantidad) AS g from tabla group by a,b having A>4
> > > > select a,b,sum(cantidad) AS p from tabla group by a,b having A>15
> > > > Gracias
> > > >
> > > >
> > > > "Alejandro Mesa" escribió:
> > > >
> > > > > Fabián,
> > > > >
> > > > > De donde salen los valores a los que te refieres, desde una tabla o son
> > > > > valores de variables?
> > > > >
> > > > > T-SQL cuenta con una expresion muy interesante y util llamada "case".
> > > > >
> > > > > select
> > > > > case
> > > > > when A > 2 and G > 4 and P > 15 then X - (A + G + P)
> > > > > when A > 2 and G < 4 and P < 15 then X - A
> > > > > else NULL -- que pasa si no se cumplen los criterios anteriores
> > > > > end as X
> > > > > from
> > > > > t1
> > > > > go
> > > > >
> > > > > Si la formula referencia variables, entonces puedes una sentencia "if".
> > > > >
> > > > > if (@A > 2 and @G > 4 and @P > 15) set @X = @X - (@A + @G + @P)
> > > > > if (@A > 2 and @G < 4 and @P < 15) set @X = @X - @A
> > > > >
> > > > >
> > > > > AMB
> > > > >
> > > > >
> > > > > "Fabián" wrote:
> > > > >
> > > > > > Hola compañeros, tengo una pregunta que a lo mejor es básica.
> > > > > > Pero no se como hacerla T-SQL
> > > > > > Sí A >2 y G>4 y P>15 entonces X=X-(A+G+P)
> > > > > > o
> > > > > > Sí A >2 y G<4 y P<15 entonces X=X-(A)
> > > > > > Espero que me haya explicado.
> > > > > > Ej.:
> > > > > > XR,
> > > > > > A=8,
> > > > > > P)
> > > > > > entonces x= 52-(6+14) y el resultado sería x2
> > > > > >
> > > > > > Desde ya muchas gracias.
> > > > > > Fabián
> > > > > >
> > > > > >
Respuesta Responder a este mensaje
#10 Fabián
15/01/2006 - 19:00 | Informe spam
Alejandro,
No se porque dices que G4 = 0. Lo mismo pasa con P15.


Esto lo digo por que:
si hago el select * from resumen1
obtengo que el afiliado 123456789013 Cantidad es 6 y el afiliado
123456789012 Cantidad es 4.
Al restarle A2 la cantidad para el afiliado 123456789013 queda cantidad 2 y
no se cumplen en consecuencia ninguna de las dos condiciones posteriores. Es
decir,
si cantidad - a2 es menor 4 entonces no tengo que restarle nada. Y como
cantidad para el mismo dia,medico es inferior a 15 entonces no tengo que
restarle nada.
Me explico?
Gracias
Fabián

"Alejandro Mesa" escribió:

Fabián,

Seguimos por parte. Para A2 creo que podemos usar:

create view med
as
SELECT
AÑO,MES,DIA,MEDICO,
sum(cantidad) as sum_cantidad
FROM RESUMEN1
GROUP BY AÑO,MES,DIA,MEDICO
go

create view a2
as
select
AÑO,MES,DIA,MEDICO,
sum(cnt) as a2
from
(
SELECT
AÑO,MES,DIA,MEDICO,AFILIADO,
case when count(*) > 2 then count(*) - 2 else 0 end as cnt
FROM RESUMEN1
GROUP BY AÑO,MES,DIA,MEDICO,AFILIADO
) as t1
group by
AÑO,MES,DIA,MEDICO
go

select
r.*, c.a2
from
med as r
left outer join
a2 as c
ON R.AÑO=C.AÑO
AND R.MES=C.MES
AND R.DIA=C.DIA
AND R.MEDICO = C.MEDICO
go

drop view med, a2
go

Para G4 y P15, necesito indagar un poco mas, porque si ejecutamos las
siguientes sentencias sobre la data de ejemplo que posteastes, entonces:

select AÑO, mes, dia, medico,substring(afiliado,1,9)as Grupo, sum(cantidad)
as G4
from resumen1
group by AÑO, mes, dia, medico,substring(afiliado,1,9)
having sum(cantidad) > 4
go

Resultado:

AÑO mes dia medico Grupo G4

2005 12 1 10331 123456789 23

No se porque dices que G4 = 0. Lo mismo pasa con P15.


AMB

"Fabián" wrote:

> Alejandro,
> > > P15 A2 G4
> > > 0 6 0
> Estos valores salen del control que hago a "mano",
> A2 = 6
> Significa que el mismo afiliado en el mismo día tuvo mas de 2 consultas.
> Y en realidad sale del
> select año,mes,dia,medico,afiliado, count(cantidad) cantidad from resumen1
> group by año,mes,dia,medico,afiliado
> 2005 12 1 10331 123456789012 4
> 2005 12 1 10331 123456789013 6
>
> Es lo que quiero conseguir, pero no se como hacerlo.
> En teoría es el select dia,medico,sum(cantidad)-2 as A2 from resumen1 group
> by dia,medico having sum(cantidad) >4.
>
> G4=0
> es el select dia,medico,substring(afiliado,1,9)as Grupo,sum(cantidad) as G4
> from resumen1 group by dia,medico,substring(afiliado,1,9) having
> sum(cantidad) >4
> P15=0
> es el select dia,medico,sum(cantidad) as P15 from resumen1 group by
> dia,medico, having sum(cantidad) >15
>
>
> "Alejandro Mesa" escribió:
>
> > Fabián,
> >
> > > Año Mes Medico Cantidad
> > > 2005 12 10331 23
> >
> > Los datos previos se entienden. Ahora explicanos de donde salen los valores:
> >
> > > P15 A2 G4
> > > 0 6 0
> >
> >
> > AMB
> >
> > "Fabián" wrote:
> >
> > > Alejandro
> > > Este es el script de creación de la tabla y la insercion de registros de
> > > prueba
> > > El resultado deseado es
> > > Año Mes Medico Cantidad P15 A2 G4 Total
> > > 2005 12 10331 23 0 6 0 17
> > >
> > >
> > > 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
> > > 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
> > >
> > > "Alejandro Mesa" escribió:
> > >
> > > > Fabián,
> > > >
> > > > Creo que mejor pones un ejemplo de la tabla, data y resultado esperado. Es
> > > > muy dificil entender lo que se quiere hacer cuando la descripcion del
> > > > problema se da de poquito en poquito.
> > > >
> > > > 1 -
> > > >
> > > > Quien es X en todo este asunto?
> > > >
> > > > 2 -
> > > >
> > > > Por que usas un alias igual al nombre de una columna?
> > > >
> > > > > select a,b,sum(cantidad) AS A from tabla group by a,b having A>2
> > > >
> > > > 3 -
> > > >
> > > > Por que filtras en la clausula "having" y no en la clausula "where", si solo
> > > > queires ciertos valores de la columna [A]?
> > > >
> > > > > select a,b,sum(cantidad) AS g from tabla group by a,b having A>4
> > > > > select a,b,sum(cantidad) AS p from tabla group by a,b having A>15
> > > >
> > > >
> > > > AMB
> > > >
> > > > "Fabián" wrote:
> > > >
> > > > > Hola, estos valores salen de una misma tabla y de un mismo campo. Que es el
> > > > > campo cantidad. Lo que pasa es que los valores son group by.
> > > > > Por ejemplo
> > > > > select a,b,sum(cantidad) AS A from tabla group by a,b having A>2
> > > > > select a,b,sum(cantidad) AS g from tabla group by a,b having A>4
> > > > > select a,b,sum(cantidad) AS p from tabla group by a,b having A>15
> > > > > Gracias
> > > > >
> > > > >
> > > > > "Alejandro Mesa" escribió:
> > > > >
> > > > > > Fabián,
> > > > > >
> > > > > > De donde salen los valores a los que te refieres, desde una tabla o son
> > > > > > valores de variables?
> > > > > >
> > > > > > T-SQL cuenta con una expresion muy interesante y util llamada "case".
> > > > > >
> > > > > > select
> > > > > > case
> > > > > > when A > 2 and G > 4 and P > 15 then X - (A + G + P)
> > > > > > when A > 2 and G < 4 and P < 15 then X - A
> > > > > > else NULL -- que pasa si no se cumplen los criterios anteriores
> > > > > > end as X
> > > > > > from
> > > > > > t1
> > > > > > go
> > > > > >
> > > > > > Si la formula referencia variables, entonces puedes una sentencia "if".
> > > > > >
> > > > > > if (@A > 2 and @G > 4 and @P > 15) set @X = @X - (@A + @G + @P)
> > > > > > if (@A > 2 and @G < 4 and @P < 15) set @X = @X - @A
> > > > > >
> > > > > >
> > > > > > AMB
> > > > > >
> > > > > >
> > > > > > "Fabián" wrote:
> > > > > >
> > > > > > > Hola compañeros, tengo una pregunta que a lo mejor es básica.
> > > > > > > Pero no se como hacerla T-SQL
> > > > > > > Sí A >2 y G>4 y P>15 entonces X=X-(A+G+P)
> > > > > > > o
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida