none
Agrupación para sumatorio agregando una columna con el ultimo valor de la agrupación. RRS feed

  • Pregunta

  • Buenos días,

    Necesito sacar una select que me sume todos los KMs de los de distintos autobuses pero necesito un campo en el que me salga la ultima parada donde se encuentra el autobus.

    DECLARE @T1 table (
    ID int NOT NULL,
    Matricula char(5) NOT NULL,
    Kms int NOT NULL,
    Parada varchar(50) NOT NULL,
    PRIMARY KEY (ID)
    );
    
    INSERT INTO @T1
    	(ID,Matricula, Kms, Parada)
    VALUES
    	(1,'A1234', 23, 'Aeropuerto'),
    	(2,'B1234', 20, 'Estación de trenes'),
    	(3,'C1234', 15, 'Aeropuerto'),
    	(4,'D1234', 12, 'Aeropuerto'),
    	(5,'A1234', 6, 'Puerto olimpico'),
    	(6,'D1234', 8, 'Centro ciudad');

    El resultado que deseo seria:
    Matricula - SumKMs - UltimaParada

    'A1234' - 29 - 'Puerto olimpico'

    'B1234' - 20 - 'Estación de trenes'

    'C1234' - 15 - 'Aeropuerto'

    'D1234' - 20 -  'Centro ciudad'

    Muchas gracias por vuestro tiempo.


    Animo!

    martes, 14 de marzo de 2017 10:24

Respuestas

  • Marc Marcus Wallace,

    Enumera según los grupos y sumariza a la vez, por ejemplo:

    WITH T AS 
    (
        SELECT ID, Matricula, Kms, Parada, 
    	   ROW_NUMBER() OVER(PARTITION BY Matricula ORDER BY ID DESC) AS [Fila],
    	   SUM(Kms) OVER(PARTITION BY Matricula) [TotalKms]
        FROM @T1
    )
    SELECT ID, Matricula, TotalKms, Parada FROM T t1 WHERE t1.Fila = 1;
    GO


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    martes, 14 de marzo de 2017 14:10

Todas las respuestas

  • Hola que tal Marc Marcus Wallace, tal este Script te ayude con lo que quieres, puedes hacerlo de varias maneras.

    use tempdb
    go
    DECLARE @T1 table (
    ID int NOT NULL,
    Matricula char(5) NOT NULL,
    Kms int NOT NULL,
    Parada varchar(50) NOT NULL,
    PRIMARY KEY (ID)
    );
    
    INSERT INTO @T1
    	(ID,Matricula, Kms, Parada)
    VALUES
    	(1,'A1234', 23, 'Aeropuerto'),
    	(2,'B1234', 20, 'Estación de trenes'),
    	(3,'C1234', 15, 'Aeropuerto'),
    	(4,'D1234', 12, 'Aeropuerto'),
    	(5,'A1234', 6, 'Puerto olimpico'),
    	(6,'D1234', 8, 'Centro ciudad');
    
    with CTE_Vista as(
    select 
         Matricula,
    SUM(kms) SumKms
    from @T1 as t1
    group by Matricula
    )
    select Matricula,SumKms,
      (select top(1) Parada from @t1 as t1 where t1.Matricula=cte.Matricula
      order by t1.id desc
      ) Parada
     from CTE_Vista as cte

    Saludos,

    Jorge Muchaypiña G.


    Business Intelligence Analyst

    martes, 14 de marzo de 2017 13:13
  • Marc Marcus Wallace,

    Enumera según los grupos y sumariza a la vez, por ejemplo:

    WITH T AS 
    (
        SELECT ID, Matricula, Kms, Parada, 
    	   ROW_NUMBER() OVER(PARTITION BY Matricula ORDER BY ID DESC) AS [Fila],
    	   SUM(Kms) OVER(PARTITION BY Matricula) [TotalKms]
        FROM @T1
    )
    SELECT ID, Matricula, TotalKms, Parada FROM T t1 WHERE t1.Fila = 1;
    GO


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    martes, 14 de marzo de 2017 14:10
  • Como puedes ver, existen varias soluciones a tu problema. Yo te recomiendo que compares el desempenio de ambas y que analises los planes de ejecucion.

    Si usas la solucion que emplea funciones de ventanas, entonces asegurate tener indices apropiados para dar soporte a la agrupacion y ventanas. Este indice suele llamarse POC (Partition By, Ordering, Convering)

    Ejemplo:

    - agrupado por (Matricula, ID DESC)

    - no-agrupado (Matricula, ID DESC) incude (Kms, Parada)

    y de no tener uno adecuado entonces posiblemente el optimizador agregue el operador [Sort] al plan de ejecucion.

    Si usas SQL Server 2016 entonces crea un indice no-agrupado tipo columnar que sea ficticio para que tomes ventajas de la mejora hecha sobre funciones de ventanas (batch mode).

    http://sqlmag.com/sql-server/what-you-need-know-about-batch-mode-window-aggregate-operator-sql-server-2016-part-1


    AMB

    Some guidelines for posting questions...

    AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas

    martes, 14 de marzo de 2017 16:05