lunes, 22 de junio de 2015

Finalización de la cuarta consulta

Domingo 21 de Junio
Hora inicio: 3:00 a.m
Hora Fin: 6:00 pm

3:00 pm - 6:00 pm
Investigación de cómo eliminar las filas repetidas sin utilizar el comando group by, ya que este comando me daba problemas de que no todas las filas con el mismo nombre eran iguales. El resultado de la investigación fue positiva, recordé un comando que se llama distinct, que hace exactamente lo que quiero, pero este comando me daba problemas junto con el comando order by que necesitaba para acomodar las actividades por fecha.
El problema era únicamente que no me los acomodaba, así que era nada más era de cambiarlos de posición.


El siguiente reto era más difícil ya que el profe no le gusta que usemos iteración en los SP, el reto era tomar las primeras 3 actividades previas más próximas por fecha, sin utilizar iteraciones.
Después de investigar en varias páginas, descubrí un comando que le agrega números consecutivos a los nombres iguales y al cambiar el nombre, los números empiezan de nuevo desde 1. Si lograba hacer que este comando funcionara toda la vida iba a tener solución, ya que lo único que tenía que hacer era filtrar los números mayores a 3.
Por desgracia la vida no es tan bella, el comando ROW_NUMBER()OVER únicamente funciona en tablas common, y como mi tabla es temporal no funcionaba, después de mucha investigación logré hacer como hacerlo, tengo que crear 2 tablas temporales y copiar el ROW_NUMBER a la segunda.

USE AgriculturalProperty;

GO

CREATE PROCEDURE reporteActividades
@Fecha date

AS

Begin
Declare @ActivitiesLots TABLE(
Nombre varchar(100),
GastoServicio int, GastoSuministro int, GastoMaquinaria int, IndiceProductividad float,
FechaInicio date, FechaFin date,
IdLote int, CodigoLote int, MetrosCuadrados Float)

Declare @Activities TABLE(
Nombre varchar(100), GastoTotal int,
GastoServicio int, GastoSuministro int, GastoMaquinaria int, IndiceProductividad float,
FechaInicio date, FechaFin date,
IdLote int, CodigoLote int, MetrosCuadrados Float, rowNum int)

INSERT INTO @ActivitiesLots
select distinct
dbo.AP_ActivityType.Name,
dbo.AP_LotXCycle.ServicesBalance, dbo.AP_LotXCycle.SuppliesBalance,
                dbo.AP_LotXCycle.MachineryBalance, dbo.AP_LotXCycle.ProductivityIndex,
                dbo.AP_Cycle.StartDate, dbo.AP_Cycle.EndDate,
                dbo.AP_Lot.ID, dbo.AP_Lot.Code, dbo.AP_Lot.SquareMeters
from dbo.AP_LotXCycle join dbo.AP_Request on
                dbo.AP_LotXCycle.ID=dbo.AP_Request.FK_LotXCycle
join dbo.AP_ActivityType on
                dbo.AP_Request.FK_ActivityType=dbo.AP_ActivityType.ID
join dbo.AP_Cycle on dbo.AP_LotXCycle.FK_Cycle=dbo.AP_Cycle.ID
join dbo.AP_Lot on dbo.AP_LotXCycle.FK_Cycle=dbo.AP_Lot.ID;

insert into @Activities
select
Nombre, GastoServicio + GastoSuministro + GastoMaquinaria,
GastoServicio, GastoSuministro, GastoMaquinaria, IndiceProductividad,
FechaInicio, FechaFin,
IdLote, CodigoLote, MetrosCuadrados,
ROW_NUMBER()OVER(PARTITION BY Nombre Order BY Nombre, FechaInicio DESC) as 'row number'
from @ActivitiesLots
where (FechaInicio<@Fecha)

select Nombre, GastoTotal,
GastoServicio, GastoSuministro, GastoMaquinaria, IndiceProductividad,
FechaInicio, FechaFin,
IdLote, CodigoLote, MetrosCuadrados
from @Activities
where rowNum<4

End

Bibliografía

Editor de consultas:
https://msdn.microsoft.com/es-es/library/ms345415(v=sql.120).aspx

Ordenar:
https://www.google.com/search?q=sql+ordenar+de+menor+a+mayor&oq=ordenar+sql+menor+a+&aqs=chrome.1.69i57j0l2.16751j0j7&sourceid=chrome&es_sm=122&ie=UTF-8

ROW_NUMBER tutorials
https://www.youtube.com/watch?v=ynWgSZBoUkU
http://stackoverflow.com/questions/1466963/sql-row-number-function-in-where-clause
http://www.sqlservercentral.com/Forums/Topic1052669-1291-1.aspx
http://www.sqlusa.com/bestpractices2005/addrownumbertotable/
https://msdn.microsoft.com/en-us/library/ms186734.aspx

No hay comentarios.:

Publicar un comentario