Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » SQL Server »

Consulta con like?

Estas en el tema de Consulta con like? en el foro de SQL Server en Foros del Web. Hola, llevo unos dias con esta consulta. En una tabla guardo las letras y en otra los nombres, me gustaría saber las veces que aparecen ...
  #1 (permalink)  
Antiguo 31/03/2011, 04:07
Avatar de triqui  
Fecha de Ingreso: diciembre-2008
Ubicación: Zaragoza(España)
Mensajes: 624
Antigüedad: 15 años, 5 meses
Puntos: 31
Consulta con like?

Hola, llevo unos dias con esta consulta.

En una tabla guardo las letras y en otra los nombres, me gustaría saber las veces que aparecen esas letras en esos nombres.


TablaNombres
____________

Maria
Juana
Creic
Pablo
Saam
Lucas


TabladeLetras
___________
a
b
c
aa
bb
cc

Y que el resultado sea este para este ejemplo el siguiente:

a | 5
b | 1
c | 1
d | 0
aa | 1
bb | 0

Es decir el nombre Saam lleva dos "aes"; cuento una como "a" y otra como "aa" igual que juana que contaria solo una como "a".

He pensado en los siguiente:

Para un SOLO ejemplo sería así
Código SQL:
Ver original
  1. SELECT Nombres,COUNT(*) FROM TablaNombres WHERE Nombres LIKE '%a%' GROUP BY Nombres

Pero claro en el like no puedo meterle todos los registros que devuelve la tabla letras.

Había pensado un cross join, pero como le meto el like?

perdidisimo que voy... la tabla letras tiene 7 millones de registros y la tabla nombres 2000, un cross join sería durisimo, pero el tiempo no es problema, tengo todo el del mundo
__________________
La nueva red social de quinielas quiniela resultados
Cazaresultados Futbol base en directo
  #2 (permalink)  
Antiguo 31/03/2011, 08:25
Avatar de flaviovich  
Fecha de Ingreso: agosto-2005
Ubicación: Lima, Peru
Mensajes: 2.951
Antigüedad: 18 años, 9 meses
Puntos: 39
Respuesta: Consulta con like?

Servido
Código SQL:
Ver original
  1. DECLARE @Nombres TABLE(nombre VARCHAR(10))
  2. DECLARE @Letras TABLE(letra VARCHAR(10))
  3.  
  4. INSERT INTO @Nombres VALUES('Maria')
  5. INSERT INTO @Nombres VALUES('Juana')
  6. INSERT INTO @Nombres VALUES('Creic')
  7. INSERT INTO @Nombres VALUES('Pablo')
  8. INSERT INTO @Nombres VALUES('Saam')
  9. INSERT INTO @Nombres VALUES('Lucas')
  10.  
  11. INSERT INTO @Letras VALUES('a')
  12. INSERT INTO @Letras VALUES('b')
  13. INSERT INTO @Letras VALUES('c')
  14. INSERT INTO @Letras VALUES('aa')
  15. INSERT INTO @Letras VALUES('bb')
  16. INSERT INTO @Letras VALUES('cc')
  17.  
  18. SELECT L.letra, SUM(CASE WHEN N.nombre IS NULL THEN 0 ELSE 1 END)
  19. FROM @Letras L
  20. LEFT JOIN @Nombres N ON charindex(L.letra, N.nombre) > 0
  21. GROUP BY L.letra
__________________
No repitamos temas, usemos el Motor de busquedas
Plantea bien tu problema: Ayúdanos a ayudarte.
  #3 (permalink)  
Antiguo 31/03/2011, 09:32
Avatar de triqui  
Fecha de Ingreso: diciembre-2008
Ubicación: Zaragoza(España)
Mensajes: 624
Antigüedad: 15 años, 5 meses
Puntos: 31
Respuesta: Consulta con like?

Gracias por la respuesta, pero me salen todos los resultados a cero.

Código SQL:
Ver original
  1. SELECT L.letra,SUM(CASE WHEN N.nombre IS NULL THEN 0 ELSE 1 END)
  2. FROM (SELECT 'a' letra FROM dual
  3.       UNION ALL
  4.       SELECT 'b'letra FROM dual
  5.       UNION ALL
  6.       SELECT 'c' letra FROM dual
  7.       UNION ALL
  8.       SELECT 'aa' letra FROM dual
  9.       UNION ALL
  10.       SELECT 'bb' letra FROM dual
  11.       UNION ALL
  12.       SELECT 'cc' letra FROM dual) L LEFT JOIN
  13.                (
  14.       SELECT 'Maria' nombre FROM dual
  15.       UNION ALL
  16.       SELECT 'Juana' nombre FROM dual
  17.       UNION ALL
  18.       SELECT 'Creic' nombre FROM dual
  19.       UNION ALL
  20.       SELECT 'Pablo' nombre FROM dual
  21.       UNION ALL
  22.       SELECT 'Saam' nombre FROM dual
  23.       UNION ALL
  24.       SELECT 'Lucas' nombre FROM dual
  25.       ) N
  26.   ON charindex(L.letra, N.nombre) > 0
  27. GROUP BY L.letra
__________________
La nueva red social de quinielas quiniela resultados
Cazaresultados Futbol base en directo
  #4 (permalink)  
Antiguo 31/03/2011, 09:38
Avatar de flaviovich  
Fecha de Ingreso: agosto-2005
Ubicación: Lima, Peru
Mensajes: 2.951
Antigüedad: 18 años, 9 meses
Puntos: 39
Respuesta: Consulta con like?

Pues fijate bien los cambios!
Código SQL:
Ver original
  1. SELECT L.letra,SUM(CASE WHEN N.nombre IS NULL THEN 0 ELSE 1 END)
  2. FROM (
  3.     SELECT 'a' letra
  4.     UNION ALL
  5.     SELECT 'b'
  6.     UNION ALL
  7.     SELECT 'c'
  8.     UNION ALL
  9.     SELECT 'aa'
  10.     UNION ALL
  11.     SELECT 'bb'
  12.     UNION ALL
  13.     SELECT 'cc'
  14. ) L
  15. LEFT JOIN (
  16.     SELECT 'Maria' nombre
  17.     UNION ALL
  18.     SELECT 'Juana'
  19.     UNION ALL
  20.     SELECT 'Creic'
  21.     UNION ALL
  22.     SELECT 'Pablo'
  23.     UNION ALL
  24.     SELECT 'Saam'
  25.     UNION ALL
  26.     SELECT 'Lucas'
  27. ) N ON charindex(L.letra, N.nombre) > 0
  28. GROUP BY L.letra
__________________
No repitamos temas, usemos el Motor de busquedas
Plantea bien tu problema: Ayúdanos a ayudarte.
  #5 (permalink)  
Antiguo 31/03/2011, 09:56
Avatar de triqui  
Fecha de Ingreso: diciembre-2008
Ubicación: Zaragoza(España)
Mensajes: 624
Antigüedad: 15 años, 5 meses
Puntos: 31
Respuesta: Consulta con like?

Estaba mirandolo y me he dado cuenta, metido corriendo, para editarlo, te me has adelantado.jejjeej

Lo habias puesto perfecto.

Es que donde lo estoy probandolo es con oracle porque hasta la noche no podre probarlo en sql server, pero en vez de charindex estaba probandolo con su homologo de oracle instr, pues resulta que va al reves !!! para echarse a llorar.

ON instr(N.nombre,L.letra) > 0
ON charindex(L.letra, N.nombre)> 0

así me he quedado



claro estaba poneniendo esto en oracle

Código SQL:
Ver original
  1. SELECT L.letra,SUM(CASE WHEN N.nombre IS NULL THEN 0 ELSE 1 END)
  2. FROM (SELECT 'a' letra FROM dual
  3.       UNION ALL
  4.       SELECT 'b'letra FROM dual
  5.       UNION ALL
  6.       SELECT 'c' letra FROM dual
  7.       UNION ALL
  8.       SELECT 'aa' letra FROM dual
  9.       UNION ALL
  10.       SELECT 'bb' letra FROM dual
  11.       UNION ALL
  12.       SELECT 'cc' letra FROM dual) L LEFT JOIN
  13.                (
  14.       SELECT 'Maria' nombre FROM dual
  15.       UNION ALL
  16.       SELECT 'Juana' nombre FROM dual
  17.       UNION ALL
  18.       SELECT 'Creic' nombre FROM dual
  19.       UNION ALL
  20.       SELECT 'Pablo' nombre FROM dual
  21.       UNION ALL
  22.       SELECT 'Saam' nombre FROM dual
  23.       UNION ALL
  24.       SELECT 'Lucas' nombre FROM dual
  25.       ) N
  26.   ON instr(N.nombre,L.letra) > 0
  27. GROUP BY L.letra;

cuando en sql server tendre que utilizar esto:

Código SQL:
Ver original
  1. SELECT L.letra,SUM(CASE WHEN N.nombre IS NULL THEN 0 ELSE 1 END)
  2. FROM (SELECT 'a' letra FROM dual
  3.       UNION ALL
  4.       SELECT 'b'letra
  5.       UNION ALL
  6.       SELECT 'c'
  7.       UNION ALL
  8.       SELECT 'aa'
  9.       UNION ALL
  10.       SELECT 'bb'
  11.       UNION ALL
  12.       SELECT 'cc' ) L LEFT JOIN
  13.                (
  14.       SELECT 'Maria' nombre
  15.       UNION ALL
  16.       SELECT 'Juana'
  17.       UNION ALL
  18.       SELECT 'Creic'
  19.       UNION ALL
  20.       SELECT 'Pablo'
  21.       UNION ALL
  22.       SELECT 'Saam'
  23.       UNION ALL
  24.       SELECT 'Lucas'
  25.       ) N
  26.   ON charindex(L.letra, N.nombre)> 0
  27. GROUP BY L.letra;

mil gracias
__________________
La nueva red social de quinielas quiniela resultados
Cazaresultados Futbol base en directo
  #6 (permalink)  
Antiguo 31/03/2011, 11:12
Avatar de flaviovich  
Fecha de Ingreso: agosto-2005
Ubicación: Lima, Peru
Mensajes: 2.951
Antigüedad: 18 años, 9 meses
Puntos: 39
Respuesta: Consulta con like?

Los parametros estan al reves:
Código SQL:
Ver original
  1. ON instr(L.letra,N.nombre) > 0
__________________
No repitamos temas, usemos el Motor de busquedas
Plantea bien tu problema: Ayúdanos a ayudarte.

Etiquetas: Ninguno
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 06:11.