none
Ordenar y filtrar la informacion de una tabla...

    Pregunta

  • Hola a toda la comunidad estoy haciendo una aplicacion para la cual necesito ordenar acendentemente toda mi informacion en base a un campo que se llama Remision, este campo se encuentra en la tabla general y es tipo nvarchar ejemplo:


    Remision
    5,7,3,1,7....

    si ustedes se fijan tengo la remision 1,3,5,7 pero me falta la 2, 4 y la 6 necito que la consulta me lo ordene de acendentemente y me diga q falta la remision 2 y la remision 4 y la remison 6 se que ustedes me ayudaran de antemano muchas gracias.........

    Hasta los momentos he logrado ordenar la tabla mediante la siguente sentencia

    SELECT * FROM [ProduccionSQL].[dbo].[General] ORDER BY CAST(CAST([Remision] AS nvarchar) AS INT)

    pero me hace falta filtar los numeros que faltan es decir todos aquellos que no esten correlativos alguna sugerencia
    miércoles, 06 de enero de 2010 14:53

Respuestas

  • ya lo tengo  


    Declare @Remisiones	Numeric
    
    create table #General (Remision Numeric);   -- ésta tabla simula la tuya llamada general
    insert into #General values (1)
    insert into #General values (5)			-- estos los valores que contiene
    insert into #General values (8)
    insert into #General values (9)
    
    
    set @remisiones = (select max(remision) from #General)
    
    
    create table #TablaTemp (Id numeric);
    
    while @Remisiones >0 begin
    	insert into #TablaTemp values(@Remisiones)       -- aqui se crea una tabla temporal
    	set @Remisiones=@Remisiones-1			-- para despues saber cuales consecutivos faltan
    end 
    
    
    select * from #tablatemp
    select * from #General
    
    select #TablaTemp.id, #general.remision
    from #tablatemp left join #general
    on #tablatemp.id=#general.remision
    where remision is null
    
    
    drop table #general
    drop table #TablaTemp
    

     


    éste código ejecutalo tal cual en un analyzer para que veas como funciona
    estudialo



    lo que tienes que hacer ya después es reemplazar la tabla #General por la tuya   ProduccionSQL].[dbo].[General]

    y con eso quedaría, pero no pongas el codigo que crea la tabla #general
    eso lo hice solo para que veas como funciona, si tienes dudas avisame

    espero haberte ayudado
    saludos
    • Propuesto como respuesta kakaroto2012 jueves, 07 de enero de 2010 20:53
    • Marcado como respuesta Ferdeg lunes, 11 de enero de 2010 16:56
    jueves, 07 de enero de 2010 20:43
  • Declare @Remisiones	Numeric
    
    set @remisiones = (select max(remision) from [ProduccionSQL].[dbo].[General])
    
    create table #TablaTemp (Id numeric);
    
    while @Remisiones >0 begin
    	insert into #TablaTemp values(@Remisiones)     
    	set @Remisiones=@Remisiones-1			
    end 
    
    
    select #TablaTemp.id, [ProduccionSQL].[dbo].[General].remision
    from #tablatemp left join [ProduccionSQL].[dbo].[General] on #tablatemp.id=[ProduccionSQL].[dbo].[General].remision
    where remision is null
    
    drop table #TablaTemp
    
    
    • Propuesto como respuesta kakaroto2012 jueves, 07 de enero de 2010 20:53
    • Marcado como respuesta Ferdeg lunes, 11 de enero de 2010 16:56
    jueves, 07 de enero de 2010 20:52
  • Hola.

    Venga, que ya casi lo tienes. Puede que te estemos liando un poco con una sintaxis que no dominas, con lo que voy a tratar de exponerlo de la forma más sencilla posible.

    Paso 1: Construir una tabla de números correlativos. Esto es sencillo, hazlo como quieras, con el límite que quieras (1.000, 10.000, 1 millón). Creo que te será más fácil si es una tabla física y estática. Por ejemplo, podrías hacerlo así:

    create table Numeros (Numero int not null primary key)
    go
    
    declare @i int
    
    select @i = 1
    
    while @i < 10000
      begin
        insert Numeros (Numero) values (@i)
        select @i = @i + 1
      end
    
    go
    

    Paso 2: La consulta en sí, de lo más sencillo (es lo que ya te hemos pasado anteriormente):

    declare @i int
    
    select @i = max(remision) from dbo.general
    
    select n.numero
    from 
      dbo.Numeros n left join 
      dbo.General g on n.numero = g.remision
    where g.remision is null and n.numero < @i
    order by numero

    Esto funciona y, salvo que no te hayamos entendido, es exactamente lo que buscas, la lista ordenada de remisiones que no están presentes en la tabla dbo.General. En cualquier caso, si tienes alguna duda, nos dices. 


    Alberto López Grande (Visita mi blog en http://qwalgrande.blogspot.es/)
    jueves, 07 de enero de 2010 20:55

Todas las respuestas

  • -- si usted ve que usted desea (SQL 2005 E 2008)
    
    SELECT C.N
    FROM [ProduccionSQL].[dbo].[General] AS A
    CROSS APPLY (SELECT (MIN([Referral]) - 1) AS N 
                 FROM   [ProduccionSQL].[dbo].[General]
                 WHERE A.[Referral] < [Referral] 
                ) AS C
    WHERE 
    	C.N IS NOT NULL
    

    Se a minha ajuda lhe for útil não esqueça de classificar. Att. Leonardo Marcelino
    miércoles, 06 de enero de 2010 17:28
  • Hola.

    Aunque dices "filtrar", creo que quieres decir "añadir" los registros que faltarían. De ser así, podrías usar algo como esto:

    declare
    @inicio tinyint,
    @fin tinyint
    select @inicio = 1, @fin = 100
    ;WITH Numeros(numero) AS (
    SELECT @inicio numero
    UNION ALL
    SELECT numero + 1 as numero
    FROM Numero
    WHERE numero < @fin
    )
    /*Para que veas lo que hace la cte
    select numero from Numeros
    OPTION (MaxRecursion 0);*/
    select cast(N.Numero as nvarchar) as Numero, isnull(G.Remision, 'Ausente') as Remision, G.*
    from 
      Numeros N left join
      ProduccionSQL.dbo.General G on cast(N.Numero as nvarchar) = G.Remision
    order by Numero
    option (MaxRecursion 0);

    Si no te vale, nos dices.


    Alberto López Grande (Visita mi blog en http://qwalgrande.blogspot.es/)
    miércoles, 06 de enero de 2010 21:12
  • Hola pues gracias por contestarme creanme me estan ayudando mucho pues les cuento que bueno la intencion de mi trabajo es decir cual de las remisiones ingresadas en el sistema hace falta por ejemplo yo tengo al rededor de 980 remisiones ingresadas en el sistema y una tabla llamada general en el cual esta el campo remision. Puede que exista remisiones repetidas es decir que exista 6 remisiones 34 o por ejemplo 5 remisiones numero 23 existe la posibilidad que no se encuentre ingresada po ejemplo la remision numero 57 (ejemplo) y eso es lo que trato de hacer para mostrarlo en el sistema para luego generar reportes de las remisiones que faltan. l cual lo estoy tratando de hacer haciendo una consulta en SQL.

    Trate de mostrar esta informacion mediante las sentencias que me dieron pero no tube exito.

    De antemano muchas gracias
    jueves, 07 de enero de 2010 15:34
  • Hola.

    Con esto último que has dicho, me he perdido. Tenemos la tabla General, donde está el campo Remision. ¿Qué debe devolver exactamente tu consulta? ¿Puedes poner un recordset simulado con el resultado deseado y un conjunto de datos de ejemplo?

    No indicas cómo se determina si una remisión está ingresada (significa que el registro existe únicamente o es otro campo el que lo marca?). Lo que te pasé te muestra todos los registros de la tabla General con valores de remisión del del 1 al 100, indicando qué registros existen (valores del campo remisión) y qué registros están ausentes. Si llegan casi hasta las 1000, cambia el valor de @fin y ponle 1000 en lugar de 100. Si existen duplicados, indica cómo discriminarlos.

    Alberto López Grande (Visita mi blog en http://qwalgrande.blogspot.es/)
    jueves, 07 de enero de 2010 15:48
  • Hola pues gracias por contestarme creanme me estan ayudando mucho pues les cuento que bueno la intencion de mi trabajo es decir cual de las remisiones ingresadas en el sistema hace falta por ejemplo yo tengo al rededor de 980 remisiones ingresadas en el sistema y una tabla llamada general en el cual esta el campo remision. Puede que exista remisiones repetidas es decir que exista 6 remisiones 34 o por ejemplo 5 remisiones numero 23 existe la posibilidad que no se encuentre ingresada po ejemplo la remision numero 57 (ejemplo) y eso es lo que trato de hacer para mostrarlo en el sistema para luego generar reportes de las remisiones que faltan. l cual lo estoy tratando de hacer haciendo una consulta en SQL.

    Trate de mostrar esta informacion mediante las sentencias que me dieron pero no tube exito.

    De antemano muchas gracias


    Te recomiendo que postees la estructura basica de la tabla, data de ejemplo en forma de sentencias insert, y el resultado deseado. De esa forma queda claro lo que tienes y lo que deseas.


    AMB
    jueves, 07 de enero de 2010 16:45
  • Hola de nuevo gracias por contestarme y disculpa si no fui suficientemente claro bien tratare de explicarlo de una mejor manera.

    tenemos la siguente tabla llamada general con los siguentes campos

    1. marca
    2. peso
    3. presio
    4. laguna
    5. fecha
    6. remision
    7. empresa
    mi intencion es ordenar toda esta tabla que es mi tabla general de mi base datos donde se guarda toda la informacion necesaria para el sistema bien el campo remision es de tipo varchar y deseo ordenarlo de mayor a menor lo cual lo pude lograr con la sentencia
    SELECT * FROM [ProduccionSQL].[dbo].[General] ORDER BY CAST(CAST([Remision] AS nvarchar) AS INT)
    pero la intencion es lograr descubrir en toda la base de datos general mediante el campo remision cuales son las remisiones que no han sido ingresadas en el sistema y no se trata de insertarlas al sistema si no solo de mostrarlas.

    por ejemplo

    esto lo haria desde visual remisiones que falta y mostrare la consulta que me muestra las remisiones que me falta por ingresar de acuerdo al correlativo por ejemplo

    1,2,3,4,7,8

    la tabla remision contiene datos en forma correlativa pero pueda que tantos datos no exista alguno como en ejemplo anterior no existio la 5,6 y me tiene que decir la consulta hace falta la remision 5 y la remision 6

    otra cosa es que no puedo poner un limite de registros ya que este todos los dias pueden ir aumentando y hoy puden ser 1000 mañana seran 1100 y asi susecivamente.

    no se si existira alguna forma de poner un contador que me cuente las remisiones y al momento de no encontrar alguna me lo diga.....

    si no fui demaciado claro con mi explicacion me lo hacen saber para dar una mejor explicacion y tartar e subirles una imagen de mi base de datos y mi intencion.........



    jueves, 07 de enero de 2010 16:56

  • si es fácil, pero primero quiero confirmar lo siguiente

    REMISIONES
    1
    2
    3
    5
    5
    6
    9
    10
    12
    12

    primero que te diga cual es el maximo de remisiones....  select max(remision) from REMISION


    te entregaria 12


    luego lo que quieres es que te diga cuales faltaron

    el resultado sería  4,7,8 y 11   (de las 12 encontradas previamente claro)

    es correcto?

    si es asi dime para hacerte la consulta

    saludos
    jueves, 07 de enero de 2010 18:44
  • siiiiiii exacto eso es asi lo deseo hacer
    jueves, 07 de enero de 2010 19:12
  • eso es lo que deseo hacer pero recuerda que la remision no es una tabla sola si no que es un campo perteneciente a la tabla general y bien se desea saber lo tu me acabas de decir
    jueves, 07 de enero de 2010 19:18
  • Debes expandir la idea que te dio Alberto (qwalgrande), la cual sugiere usar una tabla auxiliar de numeros.


    CREATE FUNCTION dbo.fn_nums(@n AS bigint) RETURNS TABLE AS
    RETURN
      WITH
      L0   AS(SELECT 1 AS c UNION ALL SELECT 1),
      L1   AS(SELECT 1 AS c FROM L0 AS A, L0 AS B),
      L2   AS(SELECT 1 AS c FROM L1 AS A, L1 AS B),
      L3   AS(SELECT 1 AS c FROM L2 AS A, L2 AS B),
      L4   AS(SELECT 1 AS c FROM L3 AS A, L3 AS B),
      L5   AS(SELECT 1 AS c FROM L4 AS A, L4 AS B),
      Nums AS(SELECT ROW_NUMBER() OVER(ORDER BY c) AS n FROM L5)
      SELECT TOP (@n) n AS Number FROM Nums ORDER BY n;
    GO

    declare @i int;

    set @i = (select max(remision) from dbo.general);

    select N.n
    from dbo.fn_nums(@i) as N left join dbo.general as G on N.n = G.Remision
    where G.Remision is null;
    GO


    AMB

    jueves, 07 de enero de 2010 19:42
  • No le complequen tanto la vida a éste señor pues es bien fácil lo que quiere, pero vas a tener que esperar un rato jejejeje voy de salida en éste momento al rato te pongo la consulta saludos
    jueves, 07 de enero de 2010 19:55
  • bien entiendo lo que me dices pero la verdad eso es nuevo para mi he tratado incluir a base de datos el codigo que me diste y se me ha echo un poco dificultoso. al momento de crear la funcion he visto que mandas a llamar a una base de datos esa no se cual seria lo otro es en esta parte del codigo.

    L0   AS(SELECT 1 AS c UNION ALL SELECT 1),
      L1   AS(SELECT 1 AS c FROM L0 AS A, L0 AS B),
      L2   AS(SELECT 1 AS c FROM L1 AS A, L1 AS B),
      L3   AS(SELECT 1 AS c FROM L2 AS A, L2 AS B),
      L4   AS(SELECT 1 AS c FROM L3 AS A, L3 AS B),
      L5   AS(SELECT 1 AS c FROM L4 AS A, L4 AS B),

    la verdad no se que hacer aqui si me orientas mas me ayudaria mucho gracias
    jueves, 07 de enero de 2010 20:07
  • ya lo tengo  


    Declare @Remisiones	Numeric
    
    create table #General (Remision Numeric);   -- ésta tabla simula la tuya llamada general
    insert into #General values (1)
    insert into #General values (5)			-- estos los valores que contiene
    insert into #General values (8)
    insert into #General values (9)
    
    
    set @remisiones = (select max(remision) from #General)
    
    
    create table #TablaTemp (Id numeric);
    
    while @Remisiones >0 begin
    	insert into #TablaTemp values(@Remisiones)       -- aqui se crea una tabla temporal
    	set @Remisiones=@Remisiones-1			-- para despues saber cuales consecutivos faltan
    end 
    
    
    select * from #tablatemp
    select * from #General
    
    select #TablaTemp.id, #general.remision
    from #tablatemp left join #general
    on #tablatemp.id=#general.remision
    where remision is null
    
    
    drop table #general
    drop table #TablaTemp
    

     


    éste código ejecutalo tal cual en un analyzer para que veas como funciona
    estudialo



    lo que tienes que hacer ya después es reemplazar la tabla #General por la tuya   ProduccionSQL].[dbo].[General]

    y con eso quedaría, pero no pongas el codigo que crea la tabla #general
    eso lo hice solo para que veas como funciona, si tienes dudas avisame

    espero haberte ayudado
    saludos
    • Propuesto como respuesta kakaroto2012 jueves, 07 de enero de 2010 20:53
    • Marcado como respuesta Ferdeg lunes, 11 de enero de 2010 16:56
    jueves, 07 de enero de 2010 20:43
  • Declare @Remisiones	Numeric
    
    set @remisiones = (select max(remision) from [ProduccionSQL].[dbo].[General])
    
    create table #TablaTemp (Id numeric);
    
    while @Remisiones >0 begin
    	insert into #TablaTemp values(@Remisiones)     
    	set @Remisiones=@Remisiones-1			
    end 
    
    
    select #TablaTemp.id, [ProduccionSQL].[dbo].[General].remision
    from #tablatemp left join [ProduccionSQL].[dbo].[General] on #tablatemp.id=[ProduccionSQL].[dbo].[General].remision
    where remision is null
    
    drop table #TablaTemp
    
    
    • Propuesto como respuesta kakaroto2012 jueves, 07 de enero de 2010 20:53
    • Marcado como respuesta Ferdeg lunes, 11 de enero de 2010 16:56
    jueves, 07 de enero de 2010 20:52
  • Hola.

    Venga, que ya casi lo tienes. Puede que te estemos liando un poco con una sintaxis que no dominas, con lo que voy a tratar de exponerlo de la forma más sencilla posible.

    Paso 1: Construir una tabla de números correlativos. Esto es sencillo, hazlo como quieras, con el límite que quieras (1.000, 10.000, 1 millón). Creo que te será más fácil si es una tabla física y estática. Por ejemplo, podrías hacerlo así:

    create table Numeros (Numero int not null primary key)
    go
    
    declare @i int
    
    select @i = 1
    
    while @i < 10000
      begin
        insert Numeros (Numero) values (@i)
        select @i = @i + 1
      end
    
    go
    

    Paso 2: La consulta en sí, de lo más sencillo (es lo que ya te hemos pasado anteriormente):

    declare @i int
    
    select @i = max(remision) from dbo.general
    
    select n.numero
    from 
      dbo.Numeros n left join 
      dbo.General g on n.numero = g.remision
    where g.remision is null and n.numero < @i
    order by numero

    Esto funciona y, salvo que no te hayamos entendido, es exactamente lo que buscas, la lista ordenada de remisiones que no están presentes en la tabla dbo.General. En cualquier caso, si tienes alguna duda, nos dices. 


    Alberto López Grande (Visita mi blog en http://qwalgrande.blogspot.es/)
    jueves, 07 de enero de 2010 20:55
  • Hola muchas gracias por ayudarme creame que cada ves me sorprendo del potencial que tiene SQL aho talves me puedas orientar en algo que aparanete mente mi query no lo capta  en la parte donde tu hace los siguente;

    insert
     into
     #General values
     (1)
    insert into #General values (5)
    insert into #General values (8)
    insert into #General values (9)
    yo lo que hago es cambiar #general por  [ProduccionSQL].[dbo].[General] pero al momento de ejecutarlo me da error

    Msg 213, Level 16, State 1, Line 4
    Insert Error: Column name or number of supplied values does not match table definition.

    talves paresca imprudente pero me gustaria que me exlicaras el codigo y me ayudaras a implementarlo muchas gracias por tu tiempo
    jueves, 07 de enero de 2010 20:59
  • tengo otra pregunta dode dice #tableTemp este es una tabla temporar o es una tabla que solo se utiliza para mostrar los datos que se desean y me recomiendas cambiarle el nombre o dejar tal como esta???????
    jueves, 07 de enero de 2010 21:01
  • entra a éste link
    luego llenas los campos
    como quieras llenarlos está bien
    y vas a ver un chat

    alli te explico



    https://remate.webex.com/sc0700l/supportcenter/scapi.do?needFilter=false&siteurl=remate&RID=0&AT=JS&I=573168392

    jueves, 07 de enero de 2010 21:03
  • Hola intente lo que me dijo qwalgrande muy pero muy interesante solo que al momento de hacer la segunda parte solo me escoje uno el primero que se encuentra en la lista es el unico que muestra y estoy seguro que existen mas pero la verdad ya casi vamos dando y es muy interesante por otro lado OMAR OLGUIN no pude ingresar al link que me diste intale un programa que me mando a descargo y luego no me puedo conectar.....  me dice La sesión en la que intenta entrar ya ha finalizado.
    jueves, 07 de enero de 2010 21:54
  • si, es un webex, la inicie para que puediera controlar tu máquina
    y hacerte el script bien ya que no sufras mas
    pero no iniciaste y lo cerre

    te mando otro

    https://remate.webex.com/sc0700l/supportcenter/scapi.do?needFilter=false&siteurl=remate&RID=0&AT=JS&I=571997080

    jueves, 07 de enero de 2010 22:04
  • ya estoy en la cesion en espera que me atiendas
    jueves, 07 de enero de 2010 22:11
  • gracias a todos por la ayuda brindada y ormar olguin bueno espero te conectes para que me ayudes en lo que quedamos claro si tienes tiempo estare pendiente de cualquier respuesta que me des garcias a todos la verdad hay mucho que aprender este mundo de la programacion es lindo.....

    viernes, 08 de enero de 2010 14:40
  • gracias a todos por la ayuda brindada y ormar olguin bueno espero te conectes para que me ayudes en lo que quedamos claro si tienes tiempo estare pendiente de cualquier respuesta que me des garcias a todos la verdad hay mucho que aprender este mundo de la programacion es lindo.....



    Probastes las sugerencias anteriores?


    AMB
    viernes, 08 de enero de 2010 15:34
  • si y tosdos me dieron grandes sugerencias y bueno seguire consultando si es necesario ahi voy avanzando
    viernes, 08 de enero de 2010 16:05
  • tengo tiempo dale si quieres...

    https://remate.webex.com/sc0700l/supportcenter/scapi.do?needFilter=false&siteurl=remate&RID=0&AT=JS&I=573853171

    viernes, 08 de enero de 2010 17:42
  • YA ESTOY EN SECION ESPERANDO QUE ME ACEPTES
    PERO APARENTEMENTE SE CAYO LA SESION
    viernes, 08 de enero de 2010 19:00
  • hola omar bueno cuando puedas me dice la verdad no estaba en la officina y por eso cuando ingrese al link que me diste ya la cesion habia terminado bueno yo estare pendiente saludos
    viernes, 08 de enero de 2010 19:39
  • Bueno osmar mañana talvez me echas la mano si tienes mas tiempo hoy creoq ue no se pudo ahi te escribo aqui en el foro...
    viernes, 08 de enero de 2010 21:57
  • Hola osmar que tal talvez puedas conectarte hoy estare esperando tu respuesta
    sábado, 09 de enero de 2010 14:44
  • ya ponle respuesta a alguien de nosotros para que no siga mostrandose como pendiente tu pregunta en el foro
    lunes, 11 de enero de 2010 16:30
  • tengo una pregunta la verdad nunca lo he echo y estoy viendo como hacerlo como llamo un stored procedure desde un data grid no se si sera mejor hacer la pregunta como nueva pregunta o aki
    lunes, 11 de enero de 2010 17:00
  • Hola.

    Sería mejor iniciar un nuevo hilo (en cualquier caso), pero quizá en un foro dedicado a la programación. Si la duda es sobre SQL Server, este es el sitio, pero si es sobre programación, seguramente obtengas más ayuda preguntando en http://social.msdn.microsoft.com/Forums/es-ES/netfxes/threads o en http://social.msdn.microsoft.com/Forums/es-ES/vbes/threads.



    Alberto López Grande (Visita mi blog en http://qwalgrande.blogspot.es/)
    lunes, 11 de enero de 2010 17:07