none
consulta rango numeración RRS feed

  • Pregunta

  • como puedo  obtener este resultado el sqlserver 2008 r2

    nro   pre
             5     10.0
             6     10.0
             7     10.0
             9     10.0
             11    10.0
             13    10.0
             15    10.0

             Rsultado
             5-7    30
             9-11   20
             13-15  20


    QUIERO MATAR ESTA DUDA ... ANTES QUE EL MUNDO DEJE DE EXISTIR..

    martes, 21 de febrero de 2017 23:31

Respuestas

Todas las respuestas

  • Hola,

    Intenta con la siguiente consulta:

    WITH T AS
    (
        SELECT
    	   t1.nro,	   
    	   CASE 
    		  WHEN t1.nro BETWEEN 5 AND 7 THEN '5-7'
    		  WHEN t1.nro BETWEEN 9 AND 11 THEN '9-11'
    		  WHEN t1.nro BETWEEN 13 AND 15 THEN '13-15'
    	   END AS [Rango],
    	   t1.pre
        FROM
    	   NombreTabla t1
    )
    SELECT t1.Rango, SUM(t1.pre) AS [pre] 
    FROM T t1 GROUP BY t1.Rango ORDER BY MIN(t1.nro);
    GO


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    martes, 21 de febrero de 2017 23:48
  • hola Willams

    Gracias por responder, pero en si los datos trabajan mas dinamicamente

    LOS DATOS DE MI TABLA QUE PUEDE VARIAR(SOLO ES UN EJEMPLO)

          nro   pre      estado
             5     10.0      A
             6     10.0      A
             7     10.0      A

             8      10.0      X         9     10.0     A

             10    10.0    A
             11    10.0    A
             12    10.0     A

    MI CONSULTA.. me tendria que salir asi(devolverlme  dos filas, como en este caso el nro 8 esta en estado X mi consulta me debe devolver dos filas, el primera rango hasta antes del estado X y otro rango despues del estado X)

    5 - 7    30

    9-13    40


    QUIERO MATAR ESTA DUDA ... ANTES QUE EL MUNDO DEJE DE EXISTIR..

    miércoles, 22 de febrero de 2017 6:12
  • Este problema es conocido como "Encontrando Islas (finding islands)", que en tu caso seria filas contiguas que mantienen el mismo estado "A".

    Una forma de resolverlo es usando las funciones de rango (ranking functions), enumerando las filas basado en el valor de la columna [nro] y tambien por ([estado], [nro]) para luego calcular la differencia de ellas.

    Ejemplo:

    DECLARE @T table (
    nro int NOT NULL PRIMARY KEY,
    pre decimal(7, 2) NOT NULL,
    estado char(1) NOT NULL
    );
    
    INSERT INTO @T
    	(nro, pre, estado)
    VALUES
    	(5, 10.0, 'A'),
    	(6, 10.0, 'A'),
    	(7, 10.0, 'A'),
    	(8, 10.0, 'X'),
    	(9, 10.0, 'A'),
    	(10, 10.0, 'A'),
    	(11, 10.0, 'A'),
    	(12, 10.0, 'A');
    
    SELECT * FROM @T;
    
    WITH R AS (
    SELECT
    	nro,
        pre,
        estado,
    	ROW_NUMBER() OVER(ORDER BY nro) - ROW_NUMBER() OVER(ORDER BY estado, nro) AS grp
    FROM
    	@T
    )
    SELECT
    	MIN(R.nro) AS mn,
    	MAX(R.nro) AS mx,
    	SUM(R.pre) AS sum_pre
    FROM
    	R
    WHERE
    	R.estado <> 'X'
    GROUP BY
    	grp
    ORDER BY
    	MIN(R.nro);
    GO

    Puedes leer mas al respecto en este excelente libro de Itzik Ben-Gan.

    https://www.amazon.com/T-SQL-Querying-Developer-Reference-Ben-Gan-ebook/dp/B00TPRWVHY/ref=dp_kinw_strp_1/165-7956025-8674260


    AMB

    Some guidelines for posting questions...

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



    miércoles, 22 de febrero de 2017 13:51