Foros del Web » Programando para Internet » ASP Clásico »

Registros aleatorios sobre consulta de unión

Estas en el tema de Registros aleatorios sobre consulta de unión en el foro de ASP Clásico en Foros del Web. Buenas, Tengo dos consultas unidas por un UNION y necesito ordenar aletoriamente el total de los registros. Al agregarle al final el ORDER BY NEWID() ...
  #1 (permalink)  
Antiguo 15/01/2010, 08:24
yz!
Invitado
 
Mensajes: n/a
Puntos:
Registros aleatorios sobre consulta de unión

Buenas,

Tengo dos consultas unidas por un UNION y necesito ordenar aletoriamente el total de los registros.

Al agregarle al final el ORDER BY NEWID() me devuelve un error que pide que la columna este incluida en la clausula SELECT.

¿Alguna idea?

Código:
(
SELECT Formacion.Id_Curso, Formacion.Visitas, Formacion.FechaAlta, Formacion.Puja, PorcentajeInscritos = CAST((SELECT COUNT(Id) FROM Formacion_Inscritos WHERE Formacion_Inscritos.Id_Curso = Formacion.Id_Curso) / CAST((CASE Formacion.Visitas WHEN 0 THEN 1 ELSE Formacion.Visitas END) AS DECIMAL(9,3)) * 100 AS DECIMAL(9,3)), Formacion.NombreCurso AS Curso, EmpresasCursos.Nombre AS Centro, EmpresasCursos.Poblacion, tbProvincias.Descripcion AS Provincia, EmpresasCursos.Logo 
FROM Formacion INNER JOIN EmpresasCursos ON Formacion.Id_Empresa = EmpresasCursos.Id_Empresa 
INNER JOIN tbProvincias ON EmpresasCursos.Provincia = tbProvincias.Id 
WHERE Formacion.Id_Delegacion = 0 AND Formacion.Sector IN (5,6,7,9,13) AND Formacion.Puja IN (SELECT TOP 4 Formacion.puja FROM Formacion ORDER BY Formacion.Puja DESC)
) UNION (
SELECT Formacion.Id_Curso, Formacion.Visitas, Formacion.FechaAlta, Formacion.Puja, PorcentajeInscritos = CAST((SELECT COUNT(Id) FROM Formacion_Inscritos WHERE Formacion_Inscritos.Id_Curso = Formacion.Id_Curso) / CAST((CASE Formacion.Visitas WHEN 0 THEN 1 ELSE Formacion.Visitas END) AS DECIMAL(9,3)) * 100 AS DECIMAL(9,3)), Formacion.NombreCurso AS Curso, Formacion_Delegaciones.Nombre AS Centro, Formacion_Delegaciones.Poblacion, tbProvincias.Descripcion AS Provincia, EmpresasCursos.Logo 
FROM Formacion INNER JOIN EmpresasCursos ON Formacion.Id_Empresa = EmpresasCursos.Id_Empresa 
INNER JOIN Formacion_Delegaciones ON Formacion.Id_Delegacion = Formacion_Delegaciones.Id_Delegacion 
INNER JOIN tbProvincias ON Formacion_Delegaciones.Provincia = tbProvincias.Id 
WHERE Formacion.Id_Delegacion <> 0 AND Formacion.Sector IN (5,6,7,9,13) AND Formacion.Puja IN (SELECT TOP 4 Formacion.puja FROM Formacion ORDER BY Formacion.Puja DESC)
) 
ORDER BY Formacion.Puja DESC, PorcentajeInscritos DESC, Formacion.Visitas DESC, Formacion.FechaAlta DESC
  #2 (permalink)  
Antiguo 15/01/2010, 09:40
Avatar de Myakire
Colaborador
 
Fecha de Ingreso: enero-2002
Ubicación: Centro de la república
Mensajes: 8.849
Antigüedad: 22 años, 3 meses
Puntos: 146
Respuesta: Registros aleatorios sobre consulta de unión

Select campos
from (
consulta 1
union
consulta 2
) tabla
order by NEWID()
  #3 (permalink)  
Antiguo 18/01/2010, 02:43
yz!
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Registros aleatorios sobre consulta de unión

Gracias por responder.

¿Que debo poner en tabla? Mis consultas son consultas inner join que recojen información de varias tablas.

Poniendo la tabla principal Formacion me da un error en el union y en esta tabla Formacion.

Así me ha quedado la consulta:
Código:
SELECT Formacion.Id_Curso, Formacion.Visitas, Formacion.FechaAlta, Formacion.Puja, PorcentajeInscritos, Curso, Centro, Poblacion, Provincia, Logo 
FROM 
(
SELECT Formacion.Id_Curso, Formacion.Visitas, Formacion.FechaAlta, Formacion.Puja, PorcentajeInscritos = CAST((SELECT COUNT(Id) FROM Formacion_Inscritos WHERE Formacion_Inscritos.Id_Curso = Formacion.Id_Curso) / CAST((CASE Formacion.Visitas WHEN 0 THEN 1 ELSE Formacion.Visitas END) AS DECIMAL(9,3)) * 100 AS DECIMAL(9,3)), Formacion.NombreCurso AS Curso, EmpresasCursos.Nombre AS Centro, EmpresasCursos.Poblacion AS Poblacion, tbProvincias.Descripcion AS Provincia, EmpresasCursos.Logo 
FROM Formacion INNER JOIN EmpresasCursos ON Formacion.Id_Empresa = EmpresasCursos.Id_Empresa 
INNER JOIN tbProvincias ON EmpresasCursos.Provincia = tbProvincias.Id 
WHERE Formacion.Id_Delegacion = 0 AND Formacion.Sector IN (5,6,7,9,13) AND Formacion.Puja IN (SELECT TOP 4 Formacion.puja FROM Formacion ORDER BY Formacion.Puja DESC)
) UNION (
SELECT Formacion.Id_Curso, Formacion.Visitas, Formacion.FechaAlta, Formacion.Puja, PorcentajeInscritos = CAST((SELECT COUNT(Id) FROM Formacion_Inscritos WHERE Formacion_Inscritos.Id_Curso = Formacion.Id_Curso) / CAST((CASE Formacion.Visitas WHEN 0 THEN 1 ELSE Formacion.Visitas END) AS DECIMAL(9,3)) * 100 AS DECIMAL(9,3)), Formacion.NombreCurso AS Curso, Formacion_Delegaciones.Nombre AS Centro, Formacion_Delegaciones.Poblacion AS Poblacion, tbProvincias.Descripcion AS Provincia, EmpresasCursos.Logo 
FROM Formacion INNER JOIN EmpresasCursos ON Formacion.Id_Empresa = EmpresasCursos.Id_Empresa 
INNER JOIN Formacion_Delegaciones ON Formacion.Id_Delegacion = Formacion_Delegaciones.Id_Delegacion 
INNER JOIN tbProvincias ON Formacion_Delegaciones.Provincia = tbProvincias.Id 
WHERE Formacion.Id_Delegacion <> 0 AND Formacion.Sector IN (5,6,7,9,13) AND Formacion.Puja IN (SELECT TOP 4 Formacion.puja FROM Formacion ORDER BY Formacion.Puja DESC) 
) Formacion 
ORDER BY Formacion.Puja DESC, NEWID(), PorcentajeInscritos DESC, Formacion.Visitas DESC, Formacion.FechaAlta DESC
  #4 (permalink)  
Antiguo 18/01/2010, 08:24
Avatar de Myakire
Colaborador
 
Fecha de Ingreso: enero-2002
Ubicación: Centro de la república
Mensajes: 8.849
Antigüedad: 22 años, 3 meses
Puntos: 146
Respuesta: Registros aleatorios sobre consulta de unión

Cita:
¿Que debo poner en tabla? Mis consultas son consultas inner join que recojen información de varias tablas.
Cuando generas una tabla a partir de una cosulta (el ejemplo que te pongo) debes de ponerle un nombre a esa tabla ya que igual puedes aplicarle una relación; "tabla" es el nombre que le puse, pero puede ser cualquier texto.
  #5 (permalink)  
Antiguo 18/01/2010, 08:34
Avatar de Myakire
Colaborador
 
Fecha de Ingreso: enero-2002
Ubicación: Centro de la república
Mensajes: 8.849
Antigüedad: 22 años, 3 meses
Puntos: 146
Respuesta: Registros aleatorios sobre consulta de unión

El el código que pones no estas generando una segunda tabla desde tu consulta UNION, supongo debieses cambiarla por algo así:

Código:
SELECT * FROM (
SELECT Formacion.Id_Curso, Formacion.Visitas, Formacion.FechaAlta, Formacion.Puja, PorcentajeInscritos = CAST((SELECT COUNT(Id) FROM Formacion_Inscritos WHERE Formacion_Inscritos.Id_Curso = Formacion.Id_Curso) / CAST((CASE Formacion.Visitas WHEN 0 THEN 1 ELSE Formacion.Visitas END) AS DECIMAL(9,3)) * 100 AS DECIMAL(9,3)), Formacion.NombreCurso AS Curso, EmpresasCursos.Nombre AS Centro, EmpresasCursos.Poblacion, tbProvincias.Descripcion AS Provincia, EmpresasCursos.Logo 
FROM Formacion INNER JOIN EmpresasCursos ON Formacion.Id_Empresa = EmpresasCursos.Id_Empresa 
INNER JOIN tbProvincias ON EmpresasCursos.Provincia = tbProvincias.Id 
WHERE Formacion.Id_Delegacion = 0 AND Formacion.Sector IN (5,6,7,9,13) AND Formacion.Puja IN (SELECT TOP 4 Formacion.puja FROM Formacion ORDER BY Formacion.Puja DESC)
 UNION 
SELECT Formacion.Id_Curso, Formacion.Visitas, Formacion.FechaAlta, Formacion.Puja, PorcentajeInscritos = CAST((SELECT COUNT(Id) FROM Formacion_Inscritos WHERE Formacion_Inscritos.Id_Curso = Formacion.Id_Curso) / CAST((CASE Formacion.Visitas WHEN 0 THEN 1 ELSE Formacion.Visitas END) AS DECIMAL(9,3)) * 100 AS DECIMAL(9,3)), Formacion.NombreCurso AS Curso, Formacion_Delegaciones.Nombre AS Centro, Formacion_Delegaciones.Poblacion, tbProvincias.Descripcion AS Provincia, EmpresasCursos.Logo 
FROM Formacion INNER JOIN EmpresasCursos ON Formacion.Id_Empresa = EmpresasCursos.Id_Empresa 
INNER JOIN Formacion_Delegaciones ON Formacion.Id_Delegacion = Formacion_Delegaciones.Id_Delegacion 
INNER JOIN tbProvincias ON Formacion_Delegaciones.Provincia = tbProvincias.Id 
WHERE Formacion.Id_Delegacion <> 0 AND Formacion.Sector IN (5,6,7,9,13) AND Formacion.Puja IN (SELECT TOP 4 Formacion.puja FROM Formacion ORDER BY Formacion.Puja DESC
) x
ORDER BY NEWID()
  #6 (permalink)  
Antiguo 18/01/2010, 08:42
yz!
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Registros aleatorios sobre consulta de unión

He llamado a esa tabla 'x' tablatemporal y me da un error en esa línea:

Mens. 102, Nivel 15, Estado 1, Línea 12
Sintaxis incorrecta cerca de 'tablatemporal'.

Por cierto, estoy trabajando con SQL server y ahora que me doy cuenta no he posteado en el foro más adecuado, perdon.
  #7 (permalink)  
Antiguo 18/01/2010, 09:10
Avatar de Myakire
Colaborador
 
Fecha de Ingreso: enero-2002
Ubicación: Centro de la república
Mensajes: 8.849
Antigüedad: 22 años, 3 meses
Puntos: 146
Respuesta: Registros aleatorios sobre consulta de unión

¿Código?

En este foro o en el de SQL si solo pones el error no te van a poder ayudar.
  #8 (permalink)  
Antiguo 18/01/2010, 09:18
yz!
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Registros aleatorios sobre consulta de unión

Amigo, ya se lo importante que es poner el código para que me podáis ayudar, pero teniendo en cuenta que la única diferencia entre la última vez que posteamos código es la sustitución de una 'x' por un 'tablatemporal'.

He supuesto que no sería necesario, pero ahi va:
Código SQL:
Ver original
  1. SELECT * FROM (
  2. SELECT Formacion.Id_Curso, Formacion.Visitas, Formacion.FechaAlta, Formacion.Puja, PorcentajeInscritos = CAST((SELECT COUNT(Id) FROM Formacion_Inscritos WHERE Formacion_Inscritos.Id_Curso = Formacion.Id_Curso) / CAST((CASE Formacion.Visitas WHEN 0 THEN 1 ELSE Formacion.Visitas END) AS DECIMAL(9,3)) * 100 AS DECIMAL(9,3)), Formacion.NombreCurso AS Curso, EmpresasCursos.Nombre AS Centro, EmpresasCursos.Poblacion, tbProvincias.Descripcion AS Provincia, EmpresasCursos.Logo
  3. FROM Formacion INNER JOIN EmpresasCursos ON Formacion.Id_Empresa = EmpresasCursos.Id_Empresa
  4. INNER JOIN tbProvincias ON EmpresasCursos.Provincia = tbProvincias.Id
  5. WHERE Formacion.Id_Delegacion = 0 AND Formacion.Sector IN (5,6,7,9,13) AND Formacion.Puja IN (SELECT TOP 4 Formacion.puja FROM Formacion ORDER BY Formacion.Puja DESC)
  6.  UNION
  7. SELECT Formacion.Id_Curso, Formacion.Visitas, Formacion.FechaAlta, Formacion.Puja, PorcentajeInscritos = CAST((SELECT COUNT(Id) FROM Formacion_Inscritos WHERE Formacion_Inscritos.Id_Curso = Formacion.Id_Curso) / CAST((CASE Formacion.Visitas WHEN 0 THEN 1 ELSE Formacion.Visitas END) AS DECIMAL(9,3)) * 100 AS DECIMAL(9,3)), Formacion.NombreCurso AS Curso, Formacion_Delegaciones.Nombre AS Centro, Formacion_Delegaciones.Poblacion, tbProvincias.Descripcion AS Provincia, EmpresasCursos.Logo
  8. FROM Formacion INNER JOIN EmpresasCursos ON Formacion.Id_Empresa = EmpresasCursos.Id_Empresa
  9. INNER JOIN Formacion_Delegaciones ON Formacion.Id_Delegacion = Formacion_Delegaciones.Id_Delegacion
  10. INNER JOIN tbProvincias ON Formacion_Delegaciones.Provincia = tbProvincias.Id
  11. WHERE Formacion.Id_Delegacion <> 0 AND Formacion.Sector IN (5,6,7,9,13) AND Formacion.Puja IN (SELECT TOP 4 Formacion.puja FROM Formacion ORDER BY Formacion.Puja DESC
  12. ) tablatemporal
  13. ORDER BY NEWID()

Y esto me da un error en:
Mens. 102, Nivel 15, Estado 1, Línea 12
Sintaxis incorrecta cerca de 'tablatemporal'.
  #9 (permalink)  
Antiguo 18/01/2010, 10:07
Avatar de Myakire
Colaborador
 
Fecha de Ingreso: enero-2002
Ubicación: Centro de la república
Mensajes: 8.849
Antigüedad: 22 años, 3 meses
Puntos: 146
Respuesta: Registros aleatorios sobre consulta de unión

Pues si era necesario por que yo no se si habías hecho algo o no a lo que yo coloqué, como puedes imaginar yo solo he arrastrado el mouse sobre tu código y agregué lo que hacía falta, tu código no lo he mirado ni una sola vez por que no es importante para tu duda principal, pero tu si deberías de verlo, y si lo hubieras visto hubieras detectado que falta el paréntesis que cierra el IN. Es claro que no lo seleccioné cuando copie y pegué tu consulta.

Por eso marca error de sintaxis
  #10 (permalink)  
Antiguo 18/01/2010, 10:14
yz!
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Registros aleatorios sobre consulta de unión

ok. Gracias.

Despues de revisar todos los parentesis y todo en general, he visto que funcionaba correctamente.

Otra forma de hacerlo es utilizando la clausula AS:

Código SQL:
Ver original
  1. SELECT campos
  2. FROM (
  3.    consulta 1
  4.    UNION
  5.    consulta 2
  6. ) AS tabla
  7. ORDER BY NEWID()
  #11 (permalink)  
Antiguo 18/01/2010, 11:50
Avatar de Myakire
Colaborador
 
Fecha de Ingreso: enero-2002
Ubicación: Centro de la república
Mensajes: 8.849
Antigüedad: 22 años, 3 meses
Puntos: 146
Respuesta: Registros aleatorios sobre consulta de unión

AS es opcional para asignar alias tanto para campos como para tablas

SELECT Campo as CampoAlias FROM Tabla as TablaAlias

=

SELECT Campo CampoAlias FROM Tabla TablaAlias

Etiquetas: registros, aleatoria
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 15:34.