Ir al contenido


Foto

First (buscar primer registro)


  • Por favor identifícate para responder
9 respuestas en este tema

#1 Caral

Caral

    Advanced Member

  • Moderador
  • PipPipPip
  • 4.266 mensajes
  • LocationCosta Rica

Escrito 27 mayo 2010 - 10:50

Hola
Tengo un problema con la busqueda del primer registro, en access lo hago asi:


sql
  1. SELECT DISTINCT Materiales.CodMaterial, Materiales.Descripcion,
  2. FIRST(TransMaterial.Fecha) AS PrimeroDeFecha,
  3. FIRST(TransMaterial.Tipo) AS PrimeroDeTipo,
  4. FIRST(TransMaterial.Usuario) AS PrimeroDeUsuario,
  5. SUM(TransMaterial.Cantidad) AS SumaDeCantidad
  6. FROM Materiales LEFT JOIN TransMaterial ON Materiales.CodMaterial = TransMaterial.CodMaterial



No me acepta el First, como lo puedo hacer?.
Saludos
  • 0

#2 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 27 mayo 2010 - 11:02

El FIRST en firebird se usa de esta forma:



sql
  1. SELECT FIRST 2 campo1, campo2, campo3 FROM tabla



Salud OS
  • 0

#3 Caral

Caral

    Advanced Member

  • Moderador
  • PipPipPip
  • 4.266 mensajes
  • LocationCosta Rica

Escrito 27 mayo 2010 - 11:05

Hola
Pero esa consulta es a dos tablas y tiene AS.
Como la haria?.
Saludos
  • 0

#4 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 27 mayo 2010 - 12:33

Hola amigo!

NO interesa si es a dos o más tablas, o si usas o no el AS.
Sólo es necesario un FIRST Nro, siendo Nro la cantidad de registros. En tu caso es: FIRST 1 ;)

Ahora bien, si usas Firebird 2.x puedes emplear también ROWS (este es el que se aconseja ahora... respeta mejor el éstandar SQL):



sql
  1. SELECT ROWS 1 ...



Debería funcionarte amigo.

Saludos,
  • 0

#5 Marc

Marc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.484 mensajes
  • LocationMallorca

Escrito 27 mayo 2010 - 01:11

Creo que el ROWS va al final de la sentencia, después de la cláusula del WHERE.

No estoy 100% seguro, ya que sigo utilizando el FIRST, pero juraría que no va al principio de la sentencia, como el FIRST.
  • 0

#6 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 27 mayo 2010 - 03:59

Creo que el ROWS va al final de la sentencia, después de la cláusula del WHERE.

No estoy 100% seguro, ya que sigo utilizando el FIRST, pero juraría que no va al principio de la sentencia, como el FIRST.

Esto me pasa por no usar Firebird 2.x :p

En efecto Marc, ROWS va al final. Había leído sobre ROWS pero como utilizo FB 1.5 me olvidé por completo como se lo utiliza y asumí que se usaba igual que SKIP.

¡Menuda metida de pata! :

Saludos,
  • 0

#7 pcicom

pcicom

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 267 mensajes
  • LocationMéxico

Escrito 27 mayo 2010 - 04:43

Intenta ASI...

Supondo que el FIRST es el primer ELEMENTO en segun su valor, por ejemplo si es una FECHA seria la FECHA mas BAJA,
Si fuera NUMERICO como PRIMEROTIPO y siendo numerico seria el mas bajo...

MIN  es el mas puequeño o minimo encontrado
MAX  el maximo o ultimo comparado como valor ddescendente/ascendente




sql
  1. SELECT DISTINCT Materiales.CodMaterial, Materiales.Descripcion,
  2. MIN(TransMaterial.Fecha) AS PrimeroDeFecha,
  3. MIN(TransMaterial.Tipo) AS PrimeroDeTipo,
  4. MIN(TransMaterial.Usuario) AS PrimeroDeUsuario,
  5. SUM(TransMaterial.Cantidad) AS SumaDeCantidad
  6. FROM Materiales
  7. LEFT JOIN TransMaterial ON Materiales.CodMaterial = TransMaterial.CodMaterial





  • 0

#8 luk2009

luk2009

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.040 mensajes
  • LocationSanto Domingo

Escrito 27 mayo 2010 - 07:47

Hola
Tengo un problema con la busqueda del primer registro, en access lo hago asi:


sql
  1. SELECT DISTINCT Materiales.CodMaterial, Materiales.Descripcion,
  2. FIRST(TransMaterial.Fecha) AS PrimeroDeFecha,
  3. FIRST(TransMaterial.Tipo) AS PrimeroDeTipo,
  4. FIRST(TransMaterial.Usuario) AS PrimeroDeUsuario,
  5. SUM(TransMaterial.Cantidad) AS SumaDeCantidad
  6. FROM Materiales LEFT JOIN TransMaterial ON Materiales.CodMaterial = TransMaterial.CodMaterial



No me acepta el First, como lo puedo hacer?.
Saludos


pues yo la veo como algo asi:


delphi
  1. select first 1  transmaterial.fecha as primerodefecha, transmaterial.tipo as primerodetipo,
  2. trasmaterial.usuario primerodeusuario from (select distinct materiales.codmaterial,materiales.descripcion
  3. from FROM Materiales LEFT JOIN TransMaterial ON Materiales.CodMaterial = TransMaterial.CodMaterial)
  4. order by transmaterial.fecha desc 




Pero me gustaria oir la explicacion de que es lo que deseas buscar. Esto por si no estoy entendiendo lo que deseas.  No puse lo de la suma, porque en este momento no tengo forma de probar el codigo y solo queria darte otra idea para ver si ese es el camino que quieres. Cualquier cosa me corrijes y asi intentare ayudarte mejor.

  • 0

#9 Caral

Caral

    Advanced Member

  • Moderador
  • PipPipPip
  • 4.266 mensajes
  • LocationCosta Rica

Escrito 04 junio 2010 - 01:51

Hola
A ver si hacemos algo.
En access tengo esto:


sql
  1. SELECT DISTINCTROW Materiales.CodMaterial, Materiales.Descripcion,
  2. FIRST(TransMaterial.Fecha) AS [Primero De Fecha],
  3. FIRST(TransMaterial.Tipo) AS [Primero De Tipo],
  4. FIRST(TransMaterial.Usuario) AS [Primero De Usuario],
  5. SUM(TransMaterial.Cantidad) AS [Suma De Cantidad]
  6. FROM Materiales LEFT JOIN TransMaterial ON Materiales.CodMaterial = TransMaterial.CodMaterial
  7. GROUP BY TransMaterial.Fecha, Materiales.CodMaterial, Materiales.Descripcion



Este query me regresa los registros No repetidos por el uso de DISTINCTROW y el primer registro de los campos que necesito.

Ahora en el mismo access este query hace casi lo mismo:


sql
  1. SELECT DISTINCTROW Materiales.CodMaterial, Materiales.Descripcion,
  2. TransMaterial.Fecha AS PrimeroDeFecha,
  3. TransMaterial.Tipo AS PrimeroDeTipo,
  4. TransMaterial.Usuario AS PrimeroDeUsuario,
  5. SUM(TransMaterial.Cantidad) AS SumaDeCantidad
  6. FROM Materiales  INNER JOIN TransMaterial ON Materiales.CodMaterial = TransMaterial.CodMaterial
  7. GROUP BY TransMaterial.Fecha, TransMaterial.Tipo,  TransMaterial.Usuario,  Materiales.CodMaterial, Materiales.Descripcion



La diferencias es que no llamo al primer registro, pero hace la consulta mas o menos bien.

Pero, si hago la consulta asi:


sql
  1. SELECT DISTINCT Materiales.CodMaterial, Materiales.Descripcion,
  2. TransMaterial.Fecha AS PrimeroDeFecha,
  3. TransMaterial.Tipo AS PrimeroDeTipo,
  4. TransMaterial.Usuario AS PrimeroDeUsuario,
  5. SUM(TransMaterial.Cantidad) AS SumaDeCantidad
  6. FROM Materiales  INNER JOIN TransMaterial ON Materiales.CodMaterial = TransMaterial.CodMaterial
  7. GROUP BY TransMaterial.Fecha, TransMaterial.Tipo,  TransMaterial.Usuario,  Materiales.CodMaterial, Materiales.Descripcion



Simplemente me muestra todos los registros, que no es lo que quiero.

Bien:
En firebird no ha forma de hacerlo, he usado Firts, no funciona, he tratado de usar Rows y no me deja.
No acepta DISTINCTROW, solo DISTINCT por lo que la consulta no funciona.

Si teneis alguna sugerencia es bienvenida.
Saludos
  • 0

#10 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 04 junio 2010 - 04:32

Hola Carlos,
No tengo Firebird e IBExpert a mano por el momento,
¿Podrías exponer el error que te muestra cuando intentas ejecutar la consulta en Firebird? Así vemos que es lo falla.

Te agradecería si nos puedes hacer llegar un ejemplo de como es tu tabla y de como quieres que quede la consulta. De este modo podremos apreciar si la consulta está bien planteada o si se puede resumir.

Esto te lo pido porque no me cuadra demasiado la idea obtener el primer registro si se va a agrupar, y por sobre todo si es que busca los distintos en una misma consulta.

Te agradecería si nos explicas más o menos como está estructurada la tabla y un ejemplo de lo que esperas de una consulta. Esto me aclararía algunas cosas.

En Firebird no es DISTINCTROW, es DISTINCT como lo establece el estándar SQL-92 (en realidad es Access, o mejor dicho Microsoft quien no está bien apegado al estándard ;) )

Para usar FIRST 1, éste debe anteceder a los campos:


sql
  1. SELECT FIRST 1 Campo1, ..., CampoN
  2. FROM ....
  3. ....



Saludos,
  • 0




IP.Board spam blocked by CleanTalk.