SQL - Filas a columnas

 
Vista:
Imágen de perfil de Daniel
Val: 16
Ha disminuido su posición en 5 puestos en SQL (en relación al último mes)
Gráfica de SQL

Filas a columnas

Publicado por Daniel (5 intervenciones) el 31/07/2019 18:13:53
Buenas, soy muy nuevo y mis conocimientos son básicos, dicho esto, tengo una base de datos con mas de 2 millones de números celulares, la base repite el dni en igual cantidad de veces que que el cliente X tiene lineas a su nombre, si tiene 5 lineas celular aparece 5 veces, necesitaría ordenar la base en 1 solo dni y x números a la derecha.
Así esta ahora:

ID_ LINEA DOC
1 37046121xx 75070xx
15 34164163xx 100668xx
470 34161786xx 100668xx
840 34366380xx 111794xx
850 34456236xx 111794xx
490 34263161xx 133774xx
612 34263161xx 133774xx
2 34363373xx 12495297xx
3 35416222xx 93089299xx
50 35865421xx 305457303xx
163 35865418xx 305457303xx

Necesito una consulta que me devuelva los datos así:

DOC LINEA1 LINEA2
100668xx 34164163xx 34161786xx
111794xx 34366380xx 34456236xx
133774xx 34263161xx 34263161xx
75070xx 37046121xx
12495297xx 34363373xx
93089299xx 35416222xx
305457303xx 35865421xx
305457303xx 35865418xx

Se agradece la ayuda, repito se muy poco de consultas de SQL, tal vez con pivot se pueda pero no se como realizar la consulta para que pivot no tomo los números como encabezados...
Saludos y gracias.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Filas a columnas

Publicado por leonardo_josue (1172 intervenciones) el 31/07/2019 22:30:43
Hola Daniel:

1. ¿Con qué BD's estas trabajando?, la solución dependerá del motor con el que estés trabajando.
2. ¿Necesitas la información en varias columnas o puede ser una sola columna con los números separados, por ejemplo, por una coma? si esto último te sirve, puedes ver si tu DBMS tiene alguna alternativa similar al GROUP_CONCAT de MySQL, es decir, algo así:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
mysql> select * from tabla;
+------+-----------+
| dni  | telefono  |
+------+-----------+
| 1    | 111111111 |
| 1    | 101010101 |
| 1    | 121212121 |
| 2    | 222222222 |
| 3    | 333333333 |
| 3    | 303030303 |
+------+-----------+
6 rows in set (0.00 sec)
 
mysql> SELECT dni, group_concat(telefono) telefonos
    -> FROM tabla
    -> GROUP BY dni;
+------+----------------------------------+
| dni  | telefonos                        |
+------+----------------------------------+
| 1    | 111111111,101010101,121212121, |
| 2    | 222222222                       |
| 3    | 333333333,303030303            |
+------+----------------------------------+
3 rows in set (0.00 sec)

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de Daniel
Val: 16
Ha disminuido su posición en 5 puestos en SQL (en relación al último mes)
Gráfica de SQL

Filas a columnas

Publicado por Daniel (5 intervenciones) el 01/08/2019 15:09:12
Buen dia, estoy trabajando con SQL Express edition 2012 (version 11.0).
Necesitaria que la informacion este en barias columnas, pero no tendria problema que este en una sola columna separadas por coma, despues lo podria dividir.
voy a investigar como pudeo hacer lo mismo con sql.
Muchas gracias, si sabes la sintaxis te agradesco si me la pasas.
Saludos Leo!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Isaias
Val: 2.761
Oro
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

Filas a columnas

Publicado por Isaias (1460 intervenciones) el 01/08/2019 19:22:29
Con el permiso de LEO

La sintaxis es la misma y el caracter internacional para separar por columnas, es el PIPE

SELECT dni, group_concat(telefono) + '|' telefonos

-> FROM tabla

-> GROUP BY dni;
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de Daniel
Val: 16
Ha disminuido su posición en 5 puestos en SQL (en relación al último mes)
Gráfica de SQL

Filas a columnas

Publicado por Daniel (5 intervenciones) el 01/08/2019 19:36:00
Buen dia, me devuelve este error.
Mens. 195, Nivel 15, Estado 10, Línea 1
'group_concat' no es un nombre de función integrada reconocido.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Filas a columnas

Publicado por leonardo_josue (1172 intervenciones) el 02/08/2019 15:33:10
Hola de nuevo Daniel:

Checa esta liga:

https://stackoverflow.com/questions/451415/simulating-group-concat-mysql-function-in-microsoft-sql-server-2005

Ahí aparecen varias formas para simular la función GROUP_CONCAT en SQL Server. Hasta donde recuerdo, SQL Server tiene una función similar al GROUP_CONCAT de MySQL pero a partir de la versión 2017.

Haz pruebas y nos comentas.

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de Daniel
Val: 16
Ha disminuido su posición en 5 puestos en SQL (en relación al último mes)
Gráfica de SQL

Filas a columnas

Publicado por Daniel (5 intervenciones) el 07/08/2019 16:02:01
Estimados
SELECT DOC, string_agg ([LINEA], ',')
FROM [dbo].[PERS_1]
GROUP BY [DOC]

De esta manera en sql 2017 funciona, ahora tengo otro problema, como los datos de los telefonos estan en FLOAT, cuando los concadena los trae asi = 1.1644e+009,1.1644e+009,1.1644e+009, respeta las comas, pero no se realmente en que los convierte, alguno sabe que deberia hacer, desde ya muchas gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Daniel
Val: 16
Ha disminuido su posición en 5 puestos en SQL (en relación al último mes)
Gráfica de SQL

Filas a columnas

Publicado por Daniel (5 intervenciones) el 07/08/2019 18:57:44
Lo solucione copiando la base a otro tabla con campos numeric(18,0).
la consulta quedo asi:

SELECT DOC,
string_agg ([LINEA], ',') as "celu"
FROM [dbo].[PERS_]
WHERE
[DOC] < = '43000000' -- la base tiene unos 13millones de doc y supera los 8000byts, asi filtro y sale ok la consulta--
GROUP BY
[DOC]

Saludos y muchas gracias por la ayuda, fueron de mucha ayuda.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar