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

[SOLUCIONADO] Dos Order By Con Union o alguna solución

Estas en el tema de Dos Order By Con Union o alguna solución en el foro de SQL Server en Foros del Web. Estimados un saludo cordial, En un stored procedure tengo algo así por ejemplo (este es un ejemplo didáctico de lo que tengo) : Código PHP: ...
  #1 (permalink)  
Antiguo 03/04/2013, 16:32
Avatar de jpogsistem  
Fecha de Ingreso: diciembre-2001
Mensajes: 2.405
Antigüedad: 22 años, 4 meses
Puntos: 4
Dos Order By Con Union o alguna solución

Estimados un saludo cordial,

En un stored procedure tengo algo así por ejemplo (este es un ejemplo didáctico de lo que tengo) :

Código PHP:
select top(1valor1
from mi_tabla
where valor
=3
order by fecha_valor desc


union all


select valor1
from mi_tabla
where valor
=
order by fecha_valor desc 

Conceptualmente en el primer Query tengo que traer el TOP(1) ordenando por "fecha valor".

En el segundo Query traigo el mismo dato e igualmente ordenado por "fecha_valor".


La cuestión es que tengo que sacar todo el query ordenado por "fecha_valor", pero preicisamente en el primer query tengo que usar un order by para traer el TOP(1).


Posibles soluciones :

- Otra forma de traer el TOP(1) en el primer query sin usar order by (la veo difícil).

- Poder usar Order By en cada una de los query sin que SQL Server me saque error. (Espero que se pueda).

- Dejar el primer Query en un stored procedure aparte y "llamarlo" y unirlo con el segundo query en otro Stored Procedure (Creo que se puede pero no tengo la menor idea).


Gracias como siempre........es importante. Saludos.
__________________
EL LIMITE ES EL UNIVERSO
  #2 (permalink)  
Antiguo 03/04/2013, 16:49
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: Dos Order By Con Union o alguna solución

Código SQL:
Ver original
  1. CREATE TABLE #temp
  2. (
  3. id INT
  4. )
  5.  
  6. INSERT INTO #temp VALUES (1)
  7. INSERT INTO #temp VALUES (2)
  8. INSERT INTO #temp VALUES (3)
  9. INSERT INTO #temp VALUES (4)
  10.  
  11. SELECT * FROM(
  12. SELECT top 1 id FROM #temp ORDER BY id DESC
  13. )t1
  14. UNION ALL
  15. SELECT * FROM(
  16. SELECT top 1 id FROM #temp ORDER BY id ASC) t2

saludos!
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #3 (permalink)  
Antiguo 03/04/2013, 16:58
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Respuesta: Dos Order By Con Union o alguna solución

Con hacerle un ORDER BY, al segundo grupo por numero de localizacion de columna, lo puedes hacer
__________________
MCTS Isaias Islas
  #4 (permalink)  
Antiguo 03/04/2013, 16:58
Avatar de jpogsistem  
Fecha de Ingreso: diciembre-2001
Mensajes: 2.405
Antigüedad: 22 años, 4 meses
Puntos: 4
Respuesta: Dos Order By Con Union o alguna solución

Agradeciendo muchísimo la ayuda pregunto............no hay una opción sin crear tablas temporales ?

Saludos y Gracias.
__________________
EL LIMITE ES EL UNIVERSO
  #5 (permalink)  
Antiguo 03/04/2013, 16:59
Avatar de jpogsistem  
Fecha de Ingreso: diciembre-2001
Mensajes: 2.405
Antigüedad: 22 años, 4 meses
Puntos: 4
Respuesta: Dos Order By Con Union o alguna solución

Cita:
Iniciado por iislas Ver Mensaje
Con hacerle un ORDER BY, al segundo grupo por numero de localizacion de columna, lo puedes hacer
Tienes algun ejemplo ?

Saludos.
__________________
EL LIMITE ES EL UNIVERSO
  #6 (permalink)  
Antiguo 03/04/2013, 17:12
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: Dos Order By Con Union o alguna solución

Cita:
Iniciado por jpogsistem Ver Mensaje
Agradeciendo muchísimo la ayuda pregunto............no hay una opción sin crear tablas temporales ?

Saludos y Gracias.
La tabla temporal que pongo es para que te guies con la que tu tienes.......

para que entiendas con tu ejemplo:

select * from(
select top(1) valor1
from mi_tabla
where valor=3
order by fecha_valor desc
) t1

union all

select * from (
select valor1
from mi_tabla
where valor=3
order by fecha_valor desc )t2
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #7 (permalink)  
Antiguo 03/04/2013, 17:16
Avatar de jpogsistem  
Fecha de Ingreso: diciembre-2001
Mensajes: 2.405
Antigüedad: 22 años, 4 meses
Puntos: 4
Respuesta: Dos Order By Con Union o alguna solución

Cita:
Iniciado por Libras Ver Mensaje
La tabla temporal que pongo es para que te guies con la que tu tienes.......

para que entiendas con tu ejemplo:

select * from(
select top(1) valor1
from mi_tabla
where valor=3
order by fecha_valor desc
) t1

union all

select * from (
select valor1
from mi_tabla
where valor=3
order by fecha_valor desc )t2

Libras, de esta forma sale este error :

"Msg 1033, Level 15, State 1, Line 20
The ORDER BY clause is invalid in views, inline functions, derived tables, subqueries, and common table expressions, unless TOP or FOR XML is also specified."
__________________
EL LIMITE ES EL UNIVERSO
  #8 (permalink)  
Antiguo 03/04/2013, 17:27
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: Dos Order By Con Union o alguna solución

Código SQL:
Ver original
  1. SELECT * FROM(
  2. SELECT top(1) valor1
  3. FROM mi_tabla
  4. WHERE valor=3
  5. ORDER BY fecha_valor DESC
  6. ) t1
  7.  
  8. UNION ALL
  9.  
  10. SELECT * FROM (
  11. SELECT valor1
  12. FROM mi_tabla
  13. WHERE valor=3
  14. )t2 ORDER BY fecha_valor DESC

y para que quieres esto?

porque con los datos de prueba que tengo sale:

4
1
2
3
4

saludos!
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me

Última edición por Libras; 03/04/2013 a las 17:34
  #9 (permalink)  
Antiguo 03/04/2013, 17:35
Avatar de jpogsistem  
Fecha de Ingreso: diciembre-2001
Mensajes: 2.405
Antigüedad: 22 años, 4 meses
Puntos: 4
Respuesta: Dos Order By Con Union o alguna solución

Ok, el query :

Código PHP:
select from(
select top(1reg.regulacion_id,reg.regulacion_resolucion_real,reg.regulacion_cuota_real,CONVERT(nvarchar(10),reg.resolucion_fecha_ejecutoria_real,103) as 'fecha ejecutoria real',reg.resolucion_fecha_ejecutoria_real
from sgva_Regulacion reg
sgva_estado_de_cuenta est
where reg
.regulacion_nit est.estado_nit_empresa and reg.regulacion_estado_id 
and reg.resolucion_fecha_ejecutoria_real <=  est.estado_fecha_inicio
and est.id_estado 145
order by reg
.resolucion_fecha_ejecutoria_real desc
t1

union all

select 
from(
select reg.regulacion_id,reg.regulacion_resolucion_real,reg.regulacion_cuota_real,CONVERT(nvarchar(10),reg.resolucion_fecha_ejecutoria_real,103) as 'fecha ejecutoria real',reg.resolucion_fecha_ejecutoria_real
from sgva_Regulacion reg
sgva_estado_de_cuenta est
where reg
.regulacion_nit est.estado_nit_empresa and reg.regulacion_estado_id 
and reg.resolucion_fecha_ejecutoria_real >=  est.estado_fecha_inicio
and reg.resolucion_fecha_ejecutoria_real <= est.estado_fecha_fin 
and est.id_estado 145
order by reg
.resolucion_fecha_ejecutoria_real asc
t2 


El resultado del primer query :




El resultado del segundo query :




Como vez el order by reg.resolucion_fecha_ejecutoria_real asc es para mostrar la fecha más antigua primero y la más nueva de último.


Gracias de Nuevo.
__________________
EL LIMITE ES EL UNIVERSO
  #10 (permalink)  
Antiguo 03/04/2013, 17:54
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: Dos Order By Con Union o alguna solución

eso ya es presentacion de datos, porque no lo haces desde tu aplicativo?

desde sql server no se me ocurre otra cosa mas que esto:

Código SQL:
Ver original
  1. DROP TABLE #temp
  2. CREATE TABLE #temp
  3. (
  4. id INT,
  5. fecha datetime
  6. )
  7.  
  8. INSERT INTO #temp VALUES (1,dateadd(dd,0,GETDATE()))
  9. INSERT INTO #temp VALUES (2,dateadd(dd,-1,GETDATE()))
  10. INSERT INTO #temp VALUES (3,dateadd(dd,-2,GETDATE()))
  11. INSERT INTO #temp VALUES (4,dateadd(dd,-3,GETDATE()))
  12.  
  13. SELECT *,IDENTITY(INT,1,1) rn INTO #temp3 FROM #temp WHERE fecha=
  14. (SELECT MIN(fecha) FROM #temp)
  15.  
  16. SELECT *,IDENTITY(INT,1,1) rn INTO #temp2 FROM #temp ORDER BY fecha ASC
  17.  
  18. SELECT * FROM(
  19. SELECT * FROM #temp2
  20. UNION
  21. SELECT * FROM #temp3) AS t1
  22. ORDER BY rn
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #11 (permalink)  
Antiguo 03/04/2013, 17:57
Avatar de jpogsistem  
Fecha de Ingreso: diciembre-2001
Mensajes: 2.405
Antigüedad: 22 años, 4 meses
Puntos: 4
Respuesta: Dos Order By Con Union o alguna solución

No es presentación ya que en base a este query el aplicativo hace un insert y debe r con ese orden de fechas.

Saludos.
__________________
EL LIMITE ES EL UNIVERSO
  #12 (permalink)  
Antiguo 03/04/2013, 18:02
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: Dos Order By Con Union o alguna solución

y porque no haces por cada query un insert?
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #13 (permalink)  
Antiguo 03/04/2013, 18:07
Avatar de jpogsistem  
Fecha de Ingreso: diciembre-2001
Mensajes: 2.405
Antigüedad: 22 años, 4 meses
Puntos: 4
Respuesta: Dos Order By Con Union o alguna solución

Es muy largo de explicar pero no se puede así.

Saludos.
__________________
EL LIMITE ES EL UNIVERSO
  #14 (permalink)  
Antiguo 03/04/2013, 18:25
Avatar de leodp77  
Fecha de Ingreso: marzo-2013
Mensajes: 39
Antigüedad: 11 años, 1 mes
Puntos: 2
Respuesta: Dos Order By Con Union o alguna solución

sí cada registro tiene un id, exceptuando el registro que te viene en el top en la 2da query no te sirve? Porque motivo no podés usar tablas temporales?
__________________
"La mejor forma de obtener información correcta de los foros de internet es enviar algo incorrecto y esperar las correcciones"
-- Matthew Austern
  #15 (permalink)  
Antiguo 03/04/2013, 21:46
Avatar de jpogsistem  
Fecha de Ingreso: diciembre-2001
Mensajes: 2.405
Antigüedad: 22 años, 4 meses
Puntos: 4
Respuesta: Dos Order By Con Union o alguna solución

Cita:
Iniciado por leodp77 Ver Mensaje
sí cada registro tiene un id, exceptuando el registro que te viene en el top en la 2da query no te sirve? Porque motivo no podés usar tablas temporales?
Nunca las he usado (llegará el día) y he escuchado que se debe hacer muy bien para no afectar el performance en la BD.
__________________
EL LIMITE ES EL UNIVERSO
  #16 (permalink)  
Antiguo 03/04/2013, 21:50
Avatar de jpogsistem  
Fecha de Ingreso: diciembre-2001
Mensajes: 2.405
Antigüedad: 22 años, 4 meses
Puntos: 4
Respuesta: Dos Order By Con Union o alguna solución

Bien muchachos agradeciéndoles como siempre su valiosa ayuda, dejo la solución que desarrollé y con la que me siento cómodo :

- Crear 1 SP para el query 1
- Crear 1 SP para el query 2
- Crear 1 SP para unir los query 1 y 2

Query1
Código PHP:
CREATE procedure [dbo].[validarEstadoCuenta_1]
@
idEstadoCuenta int 
as
select reg.regulacion_id,reg.regulacion_resolucion_real,reg.regulacion_cuota_real
reg.resolucion_fecha_ejecutoria_real as 'fecha ejecutoria real',reg.resolucion_fecha_ejecutoria_real
from sgva_Regulacion reg
sgva_estado_de_cuenta est
where reg
.regulacion_nit est.estado_nit_empresa and reg.regulacion_estado_id 
and reg.resolucion_fecha_ejecutoria_real >=  DATEADD(yy,-3,est.estado_fecha_creacion 
and 
reg.resolucion_fecha_ejecutoria_real <= est.estado_fecha_creacion 
and est.id_estado = @idEstadoCuenta
order by reg
.resolucion_fecha_ejecutoria_real asc 

Query2
Código PHP:
CREATE procedure [dbo].[validarEstadoCuenta_2]
@
idEstadoCuenta int 
as
select top(1reg.regulacion_id,reg.regulacion_resolucion_real,reg.regulacion_cuota_realreg.resolucion_fecha_ejecutoria_real as 'fecha ejecutoria real',reg.resolucion_fecha_ejecutoria_real
from sgva_Regulacion reg
sgva_estado_de_cuenta est
where reg
.regulacion_nit est.estado_nit_empresa and reg.regulacion_estado_id 
and reg.resolucion_fecha_ejecutoria_real <=  DATEADD(yy,-3,est.estado_fecha_creacion 
and 
est.id_estado = @idEstadoCuenta
order by reg
.resolucion_fecha_ejecutoria_real desc 

Query que hace el Union
Código PHP:
ALTER procedure [dbo].[validarEstadoCuenta]
@
idEstadoCuenta int 
as

declare @
validarEstadoCuenta_1 table (regulacion_id intregulacion_resolucion_real varchar(50), regulacion_cuota_real intfecha_ejecutoria_real smalldatetimeresolucion_fecha_ejecutoria_real smalldatetime)
declare @
validarEstadoCuenta_2 table (regulacion_id intregulacion_resolucion_real varchar(50), regulacion_cuota_real intfecha_ejecutoria_real smalldatetimeresolucion_fecha_ejecutoria_real smalldatetime)

insert into  @validarEstadoCuenta_2
exec validarEstadoCuenta_2 
@idEstadoCuenta

insert into  
@validarEstadoCuenta_1
exec validarEstadoCuenta_1 
@idEstadoCuenta




select regulacion_id
regulacion_resolucion_realregulacion_cuota_real,CONVERT(nvarchar(10),resolucion_fecha_ejecutoria_real,103) as 'fecha ejecutoria real'resolucion_fecha_ejecutoria_real
from 
@validarEstadoCuenta_2
union all
select regulacion_id
regulacion_resolucion_realregulacion_cuota_real,CONVERT(nvarchar(10),resolucion_fecha_ejecutoria_real,103) as 'fecha ejecutoria real'resolucion_fecha_ejecutoria_real
from 
@validarEstadoCuenta_1 

Gracias de nuevo. Saludos.
__________________
EL LIMITE ES EL UNIVERSO
  #17 (permalink)  
Antiguo 04/04/2013, 09:08
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: Dos Order By Con Union o alguna solución

Cita:
Iniciado por jpogsistem Ver Mensaje
Nunca las he usado (llegará el día) y he escuchado que se debe hacer muy bien para no afectar el performance en la BD.
no afectas el performance de la base de datos con una tabla temporal ya que si la temporal es muy grande(millones de registros) mejor creas una tabla normal para manejar dichos registros...
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me

Etiquetas: alguna, order, procedure, select, server, sql, tabla, union
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 21:35.