consulta sqlserver con order by dinamico

Iniciado por KandiZickZad, 12 Octubre 2010, 20:43 PM

0 Miembros y 1 Visitante están viendo este tema.

KandiZickZad

Buenaaaas

Este es mi problema: estoy intentando hacer un procedimiento almacenado en SQL que realice una consulta a la bd. El sp es llamado desde una app en c# al darle click a un botón.

El sp recibe el string @ordenamiento que puede ser 'e.idEmpleado asc', 'e.idEmpleado desc', 'CantidadEmpleados asc' o 'CantidadEmpleados desc'.

Encontré la manera de realizar el ORDER BY dinámico, pero no funciona y creo que es porque esta recibiendo dos expresiones (ej.: e.idEmpleado y asc)

Código (sql) [Seleccionar]

CREATE PROCEDURE consultaCorp4 (
@ordenamiento varchar
)
AS
BEGIN
SET NOCOUNT ON;
select e.idPlanta,count(e.idEmpleado) as CantidadEmpleados,sum(dp.MontoBruto) as SalariosBrutos,avg(dp.MontoBruto) as SalarioBrutoPromedio
from dbo.empleados e inner join dbo.detalle_planillas dp
on (e.idEmpleado=dp.idEmpleado)
group by e.idPlanta
order by
case @ordenamiento
when 'e.idPlanta asc' then e.idPlanta asc
when 'e.idPlanta desc' then e.idPlanta desc
when 'CantidadEmpleados asc' then CantidadEmpleados asc
when 'CantidadEmpleados desc' then CantidadEmpleados desc
end
END
GO


De qué manera podría hacer la consulta para que funcione el ORDER BY dinámico?




d(n n)b

[D4N93R]

Qué error te da cuano ejecutas de esa forma?

Shell Root

Si mal no recuerdo, intente hacerdlo, pero no me funko y me dio pereza buscar. xD

La cosa es de que, no toma el último argumento,
Código (sql) [Seleccionar]
when 'e.idPlanta asc' then e.idPlanta ASC
es decir, esta bien, pero no funciona en la parte de,
Código (sql) [Seleccionar]
[-SNIP-] e.idPlanta ASC
solo toma
Código (sql) [Seleccionar]
[-SNIP-] e.idPlanta [-SNIP-]
Por eso no duermo, por si tras mi ventana hay un cuervo. Cuelgo de hilos sueltos sabiendo que hay veneno en el aire.

KandiZickZad

mm...tengo una solucion que parece ser muy ineficiente, pero creo que sera la solución temporal mientras encuentro manera de hacer lo que quería.

Código (sql) [Seleccionar]

CREATE PROCEDURE [dbo].[consultaCorp4] (
@ordenadoPor int,
@direccion int
)
AS
BEGIN
SET NOCOUNT ON;
if @direccion=0
select e.idPlanta,count(e.idEmpleado) as CantidadEmpleados,sum(dp.MontoBruto) as SalariosBrutos,avg(dp.MontoBruto) as SalarioBrutoPromedio
from dbo.empleados e inner join dbo.detalle_planillas dp
on (e.idEmpleado=dp.idEmpleado)
group by e.idPlanta
order by case @ordenadoPor
when 0 then e.idPlanta
when 1 then 2--CantidadEmpleados
end
asc
-- otra opcion
if @direccion=1
select e.idPlanta,count(e.idEmpleado) as CantidadEmpleados,sum(dp.MontoBruto) as SalariosBrutos,avg(dp.MontoBruto) as SalarioBrutoPromedio
from dbo.empleados e inner join dbo.detalle_planillas dp
on (e.idEmpleado=dp.idEmpleado)
group by e.idPlanta
order by case @ordenadoPor
when 0 then e.idPlanta
when 1 then 2--CantidadEmpleados
end
desc
END

GO


Sip, como dijo Shell Root, en el case solo se toma el primer argumento... para realizar lo que quería entonces tengo que hacer esto... en caso de que alguien logre hallar la solución, pueden responder en este tema pq la verdad sí me interesaría saber como hacerlo de una mejor manera XD estoy segura que debe haber una mejor manera que esta.




d(n n)b

Shell Root

Pero estás ejecutando la misma QUERY, solo que cambia el ordenamiento. Porque no haces un SWITCH para ORDER BY, y otro SWITCH para ASC/DESC
Por eso no duermo, por si tras mi ventana hay un cuervo. Cuelgo de hilos sueltos sabiendo que hay veneno en el aire.