Sv Community El Salvador

Soporte y Tecnología => Programación => Base de Datos => Mensaje iniciado por: vlad en junio 01, 2008, 07:19:38 pm

Título: [Ayuda con SQL] Listar solo las filas unicas?
Publicado por: vlad en junio 01, 2008, 07:19:38 pm
Tengo una consulta, tengo una pequeña base de datos que tiene una columna con datos en esta forma:


Col
Valor1
Valor1
Valor3
Valor3
Valor2
Valor4
Valor2
Valor1
Valor1
Valor4
etc.


Pero quisiera saber como hacer para listar solo los valores no repetidos, por ej. que me quedara asi:

Col
Valor1
Valor1
Valor2
Valor3
Valor4
etc.


Estuve probando con 'select count (distinct columna) from tabla' pero eso solo me cuenta el numero de valores distintos, yo necesito saber cuales son :)

Gracias de antemano.
Título: Re: [Ayuda con SQL] Listar solo las filas unicas?
Publicado por: vlad en junio 01, 2008, 07:22:33 pm
 :phew: ups...
Se me ocurrio quitar el 'count' y probar con 'select distinct columna from tabla'  y me funcionó jejeje...

Bueno, seguro que tendre muchas otras dudas asi que voy a ocupar este tema para hacerles consultas sobre SQL.  :thumbsup:
Título: Re: [Ayuda con SQL] Listar solo las filas unicas?
Publicado por: tekun en junio 02, 2008, 11:13:37 am
hay otra que también funciona, solo que tiene otras bondades....

[gropu by]

tabla con los siguientes datos

Col
Valor1
Valor1
Valor3
Valor3
Valor2
Valor4
Valor2
Valor1
Valor1
Valor4
valor5
valor6

- sacar todos los resultados una vez
Citar
select col
from tabla
group by col

resultado


Col     
Valor1
Valor2
Valor3
Valor4
Valor5
Valor6

- sacar todos los resultados, sabiendo cuantas veces esta cada uno
Citar
select col , count(*) cantidad
from tabla
group by col

resultado

Col     cantidad
Valor1     4
Valor2     2
Valor3     2
Valor4     2
Valor5     1
Valor6     1

- sacar solamente los que estan duplicados o más de una vez
Citar
select col
from tabla
group by col
having count(col)>1

resultado

Col     
Valor1
Valor2
Valor3
Valor4

- sacar solo los que estan una vez
Citar
select col
from tabla
group by col
having count(col)=1

resultado

Col     
Valor5
Valor6

etc.......

...espero te sirva :thumbsup:
Título: Re: [Ayuda con SQL] Listar solo las filas unicas?
Publicado por: vlad en junio 02, 2008, 12:10:16 pm
 :shock: muchas gracias!, en especial este me va a servir: "- sacar todos los resultados, sabiendo cuantas veces esta cada uno"
Título: Re: [Ayuda con SQL] Listar solo las filas unicas?
Publicado por: Chepix en junio 02, 2008, 12:22:47 pm
bueno aprovechan yo ando en esto de sql tambien por ahi alguien no tendra alguna base ded atos para hacer pruebas o de donde la podemos obtener????

la q trae el sql 2005 es como medio rarona no me parece mucho si alguien tiene una por ahi para compartir a versi nos hace el cachiflin
Título: Re: [Ayuda con SQL] Listar solo las filas unicas?
Publicado por: rdoggsv en junio 02, 2008, 12:33:14 pm
SQL Server 2005 Samples and Sample Databases (http://www.microsoft.com/Downloads/details.aspx?familyid=E719ECF7-9F46-4312-AF89-6AD8702E4E6E&displaylang=en)
Título: Re: [Ayuda con SQL] Listar solo las filas unicas?
Publicado por: ruiz en junio 02, 2008, 01:24:48 pm
puedes usar el DISTINCT

SELECT DISTINCT col FROM tabla
Título: Re: [Ayuda con SQL] Listar solo las filas unicas?
Publicado por: vlad en junio 08, 2008, 04:37:38 pm
Gracias tekun, +K :), gracias ruiz tambien  :thumbsup:.

Ahora tengo otra consulta:

Pongamos un ejemplo, digamos que tengo esta consulta:

SELECT libro, capitulo, texto FROM tDatos WHERE (libro = "tal nombre") and (capitulo = "tal cap")

Pero sucede que a veces digamos no me interesa mostrar un capitulo en especifico, mas bien todos los de ese "libro"

Pense en hacer:

SELECT libro, capitulo, texto FROM tDatos WHERE (libro = "tal nombre") and (capitulo = "*")

Pensando que "*" significaria "Cualquier cosa". Sucede que o lo hago mal o estoy perdido XD.

Se que una solucion seria simplemente quitar el and (capitulo = "tal cap") de la consulta, pero me sale mas facil solo sustituir los valores que armar la consulta.

Espero que me de a entender, gracias  :thumbsup:
Título: Re: [Ayuda con SQL] Listar solo las filas unicas?
Publicado por: Trance en junio 08, 2008, 05:03:47 pm
cualquier cantidad de caracteres es: %

and capitulo like '%'

una forma podria ser:

and capitulo like  '%' || :NombreCapitulo ||'%'

donde :NombreCapitulo  es el parametro que se busca ej. capitulo 3
Título: Re: [Ayuda con SQL] Listar solo las filas unicas?
Publicado por: vlad en junio 08, 2008, 05:11:33 pm
cualquier cantidad de caracteres es: %

and capitulo like '%'


Gracias, funcionó a la perfección  :thumbsup: (+k)


Actualización: Tu ayuda me hizo buscar cual era mejor entre "Glob" y "Like" y encontré algo aun mejor:
http://web.utk.edu/~jplyon/sqlite/SQLite_optimization_FAQ.html (http://web.utk.edu/~jplyon/sqlite/SQLite_optimization_FAQ.html) Sección 5.5.1

Terminé reemplazando: and capitulo like '%' por and capitulo <> '', de esa forma creo que hace uso de indices y es mas eficiente  :yahoo:
Título: Re: [Ayuda con SQL] Listar solo las filas unicas?
Publicado por: rdoggsv en junio 08, 2008, 09:48:57 pm
si no necesitas delimitar los capitulos simplemente no pongas el and  :thumbsup:
Título: Re: [Ayuda con SQL] Listar solo las filas unicas?
Publicado por: vlad en junio 08, 2008, 10:05:04 pm
El problema con eso es que digamos tengo 3 condiciones:

Condicion1 AND Condicion2 AND Condicion3

Si digamos Condicion1 y Condicion3 dejan de importar, tendria que eliminar del 'query' las condiciones y me quedaria asi:

Condicion1 AND Condicion2 AND Condicion3

Lo que me daria error al solo intentar ejecutar "AND condicion2".

Y para evitar eso tendria que hacer un pequeño constructor que forme el query, lo cual seria mas dificil que reemplazar el "=" por "like '%'" o "glob *".

 :thumbsup:
Título: Re: [Ayuda con SQL] Listar solo las filas unicas?
Publicado por: rdoggsv en junio 08, 2008, 10:31:24 pm
ah entonces es por otro motivo que las estas creando en el momento, pero si eso andas buscando, las condiciones se deberian de ir poniendo de principio a final, si no necesitas 3 condiciones deberias de hacer tu constructor de query que la ultima elimine no las primeras, aunque si te funciona con los like y no te queres complicar la vida esta bien, pero como siempre veo que queres dejar las cosas bien retocadas  :thumbsup: me puse a pensar que estabas perdiendo velocidad usando un like innecesario :)
Título: Re: [Ayuda con SQL] Listar solo las filas unicas?
Publicado por: vlad en junio 08, 2008, 10:39:53 pm
Sabes que me acabas de iluminar  :rofl: estaba pensando mas en como eliminar lo que ya tenia en el query en lugar de ir apilando las condiciones segun las iba necesitando  :rofl:

PD: si, al leer lo de las optimizaciones tiré el like y el glob, use "Condicion <> '' " para las que eran de texto y "Condicion > 0" para las que eran de numeros.

Ya voy a hacer el constructor del query de esa forma que sugeris, me parece mas apropiado y mas estetico, gracias  :thumbsup:
Título: Re: [Ayuda con SQL] Listar solo las filas unicas?
Publicado por: vlad en agosto 27, 2008, 04:43:50 pm
Una nueva consulta:

Tengo un campo tipo DATETIME, como selecciono solo los que esten entre determinado rango de fechas?

Por ej. las que esten dentro del mes actual

Algo asi como:

SELECT * FROM tMensualidades WHERE Codigo="XXX" AND Mes BETWEEN date('now','start of month') AND date('now','start of month','+1 month','-1 day');

?
Título: Re: [Ayuda con SQL] Listar solo las filas unicas?
Publicado por: vlad en agosto 27, 2008, 05:30:01 pm
SELECT * FROM tMensualidades WHERE Codigo="XXX" AND Mes BETWEEN date('now','start of month') AND date('now','start of month','+1 month','-1 day');

Gracias y olvidenlo, eso funciona x_x lo que pasa es que las fechas en la base de datos estaban escritas en la forma "dd/mm/yy" y SQL las queria en forma "yyyy/mm/dd" x_x
Título: Re: [Ayuda con SQL] Listar solo las filas unicas?
Publicado por: rcguillen en agosto 27, 2008, 06:37:17 pm
Mi consejo basado en experiencia es q para manejar fechas las manejes en el formato añomesdia digamos si quieres el periodo del 1 al 31 de enero seri asi

select * from mytabla where convert(char(8),myfecha,112) >= '20080101' and convert(char(8),myfecha,112) <= '20080131'

Trata de aplicar ambas formas de hacer los select tanto la q ya tienes como la q te estoy colocando aca y saca tus conclusiones.

Saludos

Gracias y olvidenlo, eso funciona x_x lo que pasa es que las fechas en la base de datos estaban escritas en la forma "dd/mm/yy" y SQL las queria en forma "yyyy/mm/dd" x_x
Título: Re: [Ayuda con SQL] Listar solo las filas unicas?
Publicado por: vlad en octubre 10, 2008, 07:13:30 am
Gracias :)



Una nueva consulta:

Supongamos que tengo dos tablas:


Tabla1: Abreviaturas

No | Valor
1 | Abreviatura1
2 | Abreviatura 2
3 | Abreviatura 3
n | Abreviatura n

Tabla2: Datos

No | Descripcion
1 | Descripción 1
2 | Descripción 2
3 | Descripción 3
n | Descripción n

Entonces quisiera que al realizar la consulta de la tabla 2, la col "No" fuera reemplazado por su respectivo valor (de Abreviatura) segun la tabla 1. Como puedo logra esto?.

Ahorita lo estoy haciendo asi:

select Abreviatura, Descripcion from tabla1, tabla2 on tabla1.No = tabla2.No

Eso me funciona, pero aun en una pequeña base de datos con solo 40000 registros, esto hace un gran, GRAN, detrimento en el desempeño.

Alguna sugerencia?.

Buscaba algo menos asi (no es que funcione, pero no se si se podra):

select No as Abreviatura, Descripcion from tabla2
Título: Re: [Ayuda con SQL] Listar solo las filas unicas?
Publicado por: tekun en octubre 10, 2008, 08:39:09 am
.........
Entonces quisiera que al realizar la consulta de la tabla 2, la col "No" fuera reemplazado por su respectivo valor (de Abreviatura) segun la tabla 1. Como puedo logra esto?.

Ahorita lo estoy haciendo asi:

select Abreviatura, Descripcion from tabla1, tabla2 on tabla1.No = tabla2.No

Eso me funciona, pero aun en una pequeña base de datos con solo 40000 registros, esto hace un gran, GRAN, detrimento en el desempeño.

Alguna sugerencia?.....

va!

intentando entender lo que has planteado lo dire en otras palabras....

si no me equivoco de lo que tenes y lo que queres lograr... es unir en un resultado campos de dos tablas diferentes....

de ser así, parto de la idea de que ambas tablas estan relacionadas.... y el constraint esta en el campo "No".... esto -no necesariamente- requiere que la relación exista en la base de datos...porque optimizara las consultas que hagas relacionando ambas tablas.... esto puede ser un factor por el cual se tarde el script que ejecutas...

ahora con tu script...
select Abreviatura, Descripcion from tabla1, tabla2 on tabla1.No = tabla2.No

para iniciar te dire, quizá no te diste cuenta que según lo que has puesto, el Campo "Abreviatura" no existe, ese es el dato, según tu ejemplo el nombre del campo es "Valor" en la tabla 1..... pero igual, ya intentaste poniendo el where tabla1.No=tabla2.No en lugar de lo que tenés....


otra cosa....
según lo último que decis.... eso yo lo veo como una sub-consulta (subQuery)..... quedaría algo así...

Código: [Seleccionar]
select
(select Valor from tabla1 where a.No=No) as Abreviatura
,Descripcion
from tabla2 as a
Título: Re: [Ayuda con SQL] Listar solo las filas unicas?
Publicado por: JGuillen™ en octubre 10, 2008, 02:42:41 pm
Yo lo entiendo de esta manera....


Queres mostrar todas las abreviaturas de la tabla1 que tambien esten en la tabla 2... entonces lo haria a si....



Código: [Seleccionar]
select A.No, B.descripcion from tabla1 as A inner join tabla2 as B on A.No = B.No


Sera eso lo que necesitas.... porq eso es lo que entiendo q necesitas.... sera eso...?  :huh:
Título: Re: [Ayuda con SQL] Listar solo las filas unicas?
Publicado por: John Stark! en octubre 10, 2008, 03:30:27 pm
Vlad:

la solicion es lo que te dice Juillen
Citar
SELECT [id1].Abreviatura, [id2].Descripcion FROM Tabla1 AS [id1] INNER JOIN Tabla2 AS [id2] ON [id1].No=[id2].No

la sentencia que tu planteabas
Citar
select No as Abreviatura, Descripcion from tabla2
lo unico que haria es cambiar el nombre de la columna No a Abreviatura pero te seguiria regresando los datos de No.

Ademas, si la consulta aun asi es demasido lenta, prueba haciendo una vista con la consulta de arriiba. asi la llamas cuando necesites.  :thumbsup:
Título: Re: [Ayuda con SQL] Listar solo las filas unicas?
Publicado por: vlad en octubre 10, 2008, 07:46:25 pm
Muchisimas gracias a los tres, voy a probar las tres soluciones, sin embargo ahorita sin probarlas, creo que la respuesta de Tekun es la más aproximada a lo que necesito.

La de JGuillen™ me parece que en la columna "No" me devolvería el valor en "No" y no su abreviatura.

La de Vladimir
Código: [Seleccionar]
SELECT [id1].Abreviatura, [id2].Descripcion FROM Tabla1 AS [id1] INNER JOIN Tabla2 AS [id2] ON [id1].No=[id2].No Gracias, pero es asi como lo tengo ahorita (reemplazando el INNER JOIN por "," y sin los alias de las tablas). Te agradezco la otra correccion que me hiciste.

La de tekun
Código: [Seleccionar]
select (select Valor from tabla1 where a.No=No) as Abreviatura, Descripcion from tabla2 as aMe parece que es justo lo que busco, lo cual es hacer el reemplazo sin necesidad de hacer el join, que es la operacion mas costosa porque me une una tablad e 40000 valores con una de 73 (hay solo 73 abreviaturas, repartidas en 40000 registros).



Como sea, probaré una por una en  iguales condiciones para determinar cual es la más veloz.

Muchas gracias de antemano, se han ganado un K+ de mi parte!
Título: Re: [Ayuda con SQL] Listar solo las filas unicas?
Publicado por: Gaara en abril 13, 2009, 03:29:33 pm
Bueno mi problema es parecido al que se planteaba en este post un poco mas complejo talves me puedan ayudar bueno yo tengo algo parecido a esto, dentro de un procedimiento almacenado

userid   mail         body   
1              email1   cuerpo1
1              email1   cuerpo2
2              email2   cuerpo3
2              email2   cuerpo4
3              email3   cuerpo5
4              email4   cuerpo6

quiero obtener algo parecido a esto:

userid   mail         body   
1              email1   cuerpo1 + cuerpo2
2              email2   cuerpo3 + cuerpo4
3              email3   cuerpo5
4              email4   cuerpo6

la cuestion es que en este bloque de información obtenga todos los cuerpos de todos los mensajes que le corresponden a ese usuario,
esto sirve para que por ejemplo en lugar de mandar diez correos yo solo mande un correo con toda la información correspondiente espero me
puedan ayudar lo intente con cursores scroll  pero ya me hice bolas   :phew:






Título: Re: [Ayuda con SQL] Listar solo las filas unicas?
Publicado por: vlad en abril 13, 2009, 04:10:31 pm
SELECT DISTINCT userid, GROUP_CONCAT(body) FROM tabla GROUP BY userid
Título: Re: [Ayuda con SQL] Listar solo las filas unicas?
Publicado por: tekun en abril 13, 2009, 08:30:44 pm
userid   mail         body   
1              email1   cuerpo1
1              email1   cuerpo2
2              email2   cuerpo3
2              email2   cuerpo4
3              email3   cuerpo5
4              email4   cuerpo6

quiero obtener algo parecido a esto:

userid   mail         body   
1              email1   cuerpo1 + cuerpo2
2              email2   cuerpo3 + cuerpo4
3              email3   cuerpo5
4              email4   cuerpo6

que RDBMS tas ocupando...?¿?¿

porque si es postgres ya la hiciste, porque existen crosstab que es justo lo que necesitas...

porque en sqlServer de MS [se me ocurre] te tocara buscar los datos en un cursor y incrustar el resultado en una tabla temporal y luego mostrar el resultado
Título: Re: [Ayuda con SQL] Listar solo las filas unicas?
Publicado por: darkness51 en abril 13, 2009, 09:22:13 pm
Vlad, la respuesta de tekun se conoce como plano cartesiano y la otra que te habian dado se conoce como join
Título: Re: [Ayuda con SQL] Listar solo las filas unicas?
Publicado por: vlad en abril 14, 2009, 04:37:19 am
Vlad, la respuesta de tekun se conoce como plano cartesiano y la otra que te habian dado se conoce como join
Gracias, si, la respuesta de Tekun fue acertada  :sur:

Gracias Tekun, se me habia olvidado este tema xD
Título: Re: [Ayuda con SQL] Listar solo las filas unicas?
Publicado por: Gaara en abril 14, 2009, 07:57:40 am
SELECT DISTINCT userid, GROUP_CONCAT(body) FROM tabla GROUP BY userid

Hey gracias Vlad me puse a investigar acerca de la funcion group_concat de mysql y es justamente lo que necesito gracias  :thumbsup: solo que tengo un problemilla esa función no existe en sql server 2005 de microsoft  x_x alguno de ustedes sabra de algo equivalente???  :sorry:
Título: Re: [Ayuda con SQL] Listar solo las filas unicas?
Publicado por: vlad en abril 14, 2009, 08:08:22 am
Hey que lastima, pense que tambien estabas usando MySQL :phew:

Sin embargo por suerte parece que no sos el primero que necesita simular group_concat en SQL Server 2005:
http://www.google.com.sv/search?q=group_concat+sql+server+2005&ie=utf-8&oe=utf-8 (http://www.google.com.sv/search?q=group_concat+sql+server+2005&ie=utf-8&oe=utf-8)

En especial este resultado [en ingles]:
http://blog.shlomoid.com/2008/11/emulating-mysqls-groupconcat-function.html (http://blog.shlomoid.com/2008/11/emulating-mysqls-groupconcat-function.html)
Título: Re: [Ayuda con SQL] Listar solo las filas unicas?
Publicado por: Gaara en abril 14, 2009, 08:33:38 am
Hey que lastima, pense que tambien estabas usando MySQL :phew:

Sin embargo por suerte parece que no sos el primero que necesita simular group_concat en SQL Server 2005:
http://www.google.com.sv/search?q=group_concat+sql+server+2005&ie=utf-8&oe=utf-8 (http://www.google.com.sv/search?q=group_concat+sql+server+2005&ie=utf-8&oe=utf-8)

En especial este resultado [en ingles]:
http://blog.shlomoid.com/2008/11/emulating-mysqls-groupconcat-function.html (http://blog.shlomoid.com/2008/11/emulating-mysqls-groupconcat-function.html)



Hey gracias Vlad  :thumbsup: habia estado buscando en san google pero no habia encontrado nada me parece que esa ultima pagina que has posteado tiene la solución gracias  :thumbsup: