Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » SQL Server »

Problema con subconsulta

Estas en el tema de Problema con subconsulta en el foro de SQL Server en Foros del Web. Buenos dias a todos. Tengo un problemita con una consulta a una tabla donde registro las actividades de mi negocio asi como su cantidad mensual. ...
  #1 (permalink)  
Antiguo 14/03/2012, 11:32
 
Fecha de Ingreso: diciembre-2010
Mensajes: 22
Antigüedad: 13 años, 4 meses
Puntos: 0
Pregunta Problema con subconsulta

Buenos dias a todos.

Tengo un problemita con una consulta a una tabla donde registro las actividades de mi negocio asi como su cantidad mensual. Mi tabla esta estructurada de la siguiente manera:

TABLA: ACTIVIDADES

idActividad Nombre Mes Cantidad
-------------- ----------------- ---------- -------------------
1 consultas 1 10
1 consultas 2 10
1 consultas 5 20
1 consultas 4 25
3 atenciones 1 30
2 brigadas 1 30
2 brigadas 3 40
1 consultas 3 40
3 atenciones 3 50
3 atenciones 2 50
3 atenciones 4 25
2 brigadas 2 25

Y lo que pretendo es que los meses y las cantidades me los genere como columnas en lugar de filas y que unicamente me deje el id de actividad y el nombre. La consulta seria para verlos de la siguiente manera:

idActividad NomActividad 1 (mes) 2(mes) 3 (mes) 4 (mes) 5 (mes)
------------- ------------------ ---------- --------- ---------- ---------- ----------
1 consultas 10 10 40 25 20
2 brigadas 30 25 40
3 atenciones 30 50 50 25


Estaba elborado una consulta pero me marca el siguiente error:

La subconsulta ha devuelto más de un valor, lo que no es correcto cuando va a continuación de =, !=, <, <=, >, >= o cuando se utiliza como expresión.

Mi consulta es la siguiente:
select distinct idActividad, NomActividad, 1=ISNULL((Select Cantidad from Actividades where mes=1),0), 2=ISNULL((Select Cantidad from Actividades where Mes=2 ),0) from Actividades order by id


No se si me pudieran ayudar con el error que me marca para corregirlo o que me pudiera sugerir alguna consulta para poder hacer mi consulta. SALUDOS Y GRACIAS.
  #2 (permalink)  
Antiguo 14/03/2012, 12:00
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Problema con subconsulta

prueba con la funcion pivot :)
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #3 (permalink)  
Antiguo 14/03/2012, 13:00
 
Fecha de Ingreso: diciembre-2010
Mensajes: 22
Antigüedad: 13 años, 4 meses
Puntos: 0
Respuesta: Problema con subconsulta

Perdona mi pregunta pero es que no soy bueno en sql, el PIVOT se usa forzosamente con una consulta del tipo count, sum, etc.? es que de los ejemplos que encuentro lo traen, o no se si me pudieras dejar un ejemplo sencillo.

Gracias Saludos.
  #4 (permalink)  
Antiguo 14/03/2012, 13:57
 
Fecha de Ingreso: julio-2008
Mensajes: 33
Antigüedad: 15 años, 9 meses
Puntos: 0
Respuesta: Problema con subconsulta

Prueba poniendo comillas simples a los nombres que le estás asignando a las columnas.

select distinct idActividad, NomActividad, '1'=ISNULL((Select Cantidad from Actividades where mes=1),0), '2'=ISNULL((Select Cantidad from Actividades where Mes=2 ),0) from Actividades order by id

Saludos
  #5 (permalink)  
Antiguo 14/03/2012, 13:57
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Problema con subconsulta

No necesariamente tiene que ser un count, puede ser un max, un avg etc.. checate el ejemplo en donde la columna Tepo es el pivote :)
Código SQL:
Ver original
  1. CREATE TABLE #temp
  2. (
  3. pointid INT,
  4. lanid INT,
  5. thelabel VARCHAR(30),
  6. datatime datetime,
  7. datavalue VARCHAR(10),
  8. theunits VARCHAR(10),
  9. Expr1 VARCHAR(10)
  10. )
  11.  
  12.  
  13.  
  14. INSERT INTO #temp VALUES (580,8,'Hotel Columbus','10/07/2011 11:00','49,21','DegC','TEP01')
  15. INSERT INTO #temp VALUES (581,9,'Hotel Columbus2','10/08/2011 11:00','49,21','DegC2','TEP02')
  16. INSERT INTO #temp VALUES (581,9,'Hotel Columbus3','10/08/2011 11:00','49,21','DegC2','TEP03')
  17.  
  18.  
  19. SELECT pointid,lanid,thelabel,datatime,datavalue,theunits,[TEP01],[TEP02],[TEP03]
  20. FROM
  21. (
  22.    SELECT Expr1,pointid,lanid,thelabel,datatime,datavalue,theunits FROM #temp
  23. ) AS SOURCE
  24. pivot
  25. (
  26.   MAX(Expr1) FOR Expr1 IN ([TEP01],[TEP02],[TEP03])
  27. ) AS pvt
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #6 (permalink)  
Antiguo 20/03/2012, 11:44
 
Fecha de Ingreso: diciembre-2010
Mensajes: 22
Antigüedad: 13 años, 4 meses
Puntos: 0
Respuesta: Problema con subconsulta

Antes que nada gracias por responderme.

En realidad estuve checando las dos formas que me sugirierón, sin embargo la opción que me dio libras me hace un promedio de las caantidadas o sumas dependeiendo de la funcion que le ponga sin embargo yo solo quiero que me muestre los resultados sin ello. Lo que yo necesito seria en ves de poner varias filas con idActividad x cantidad y, mes 1 ........ idActividad x cantidad y, mes 12, en lugar de ello me muestre idactividad, Cantidad(mes 1).... , Cantidad(mes 12)

creo que el metodo que me sugeria parvoli es mas lo que estoy buscando solo que me arroja el sig. error:

La subconsulta ha devuelto más de un valor, lo que no es correcto cuando va a continuación de =, !=, <, <=, >, >= o cuando se utiliza como expresión.

Agradecería que me apoyaran con esta cuestion gracias
  #7 (permalink)  
Antiguo 23/03/2012, 01:46
Avatar de Joch_pa  
Fecha de Ingreso: octubre-2009
Ubicación: Pachuca De Soto, Hidalgo, Mexico, Mexico
Mensajes: 122
Antigüedad: 14 años, 6 meses
Puntos: 7
Respuesta: Problema con subconsulta

si te sirve la de parboli entonces cámbiala por algo así:

Código SQL:
Ver original
  1. SELECT DISTINCT
  2.     A.idActividad
  3.     , A.NomActividad
  4.     , '1'=ISNULL((SELECT Cantidad FROM Actividades WHERE mes=1 AND idActividad=A.idActividad ),0)
  5.     , '2'=ISNULL((SELECT Cantidad FROM Actividades WHERE mes=2 AND idActividad=A.idActividad ),0)
  6. FROM Actividades A
  7. ORDER BY A.idActividad

lo que hice fue utilizar un alias para meterlo en las subconsultas
Agrega las columnas faltantes y listo

Etiquetas: registro, select, subconsulta, tabla
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 17:55.