SQL - ayuda consulta sql

 
Vista:

ayuda consulta sql

Publicado por Ismael (5 intervenciones) el 10/10/2012 06:21:24
Tengo una base de datos en SQL SERVER:

Tabla: TABLE1

id nombre valor
1, Juan, 12
2, Juan, 32
3, Juan, 51
4, Mario, 58
5, Mario, 19
6, Mario, 74
7, Melisa, 27
8, Melisa, 58
9, Melisa, 36
10, Carlos, 27
11, Carlos, 11

alguien podria ayudarme a hacer un query que me obtenga este resultado:

nombre valor1 valor2 valor3

Juan 12, 32, 51
Mario 58, 19, 74
Melisa 27, 58, 36
Carlos 27, 11, -


Los nombres en esta tabla tendran 3 valores maximo, si no existe valor se pondra "-" como en el ejemplor

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
Imágen de perfil de Isaias
Val: 2.542
Oro
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

ayuda consulta sql

Publicado por Isaias (1921 intervenciones) el 10/10/2012 18:56:14
En FDW, GeriReshef, te recomendo:
CREATE TABLE TABLE1(id Int, nombre Varchar(Max), valor Int);
Go

INSERT INTO TABLE1 SELECT 1, 'Juan', 12;
INSERT INTO TABLE1 SELECT 2, 'Juan', 32;
INSERT INTO TABLE1 SELECT 3, 'Juan', 51;
INSERT INTO TABLE1 SELECT 4, 'Mario', 58;
INSERT INTO TABLE1 SELECT 5, 'Mario', 19;
INSERT INTO TABLE1 SELECT 6, 'Mario', 74;
INSERT INTO TABLE1 SELECT 7, 'Melisa', 27;
INSERT INTO TABLE1 SELECT 8, 'Melisa', 58;
INSERT INTO TABLE1 SELECT 9, 'Melisa', 36;
INSERT INTO TABLE1 SELECT 10, 'Carlos', 27;
INSERT INTO TABLE1 SELECT 11, 'Carlos', 11;
Go

WITH T AS
(SELECT Row_Number() Over(Partition BY nombre ORDER BY id) Nm,
*
FROM TABLE1)
SELECT nombre,
IsNull(Max(Case When Nm=1 Then Cast(Valor AS Varchar) End),'-')+','
+IsNull(Max(Case When Nm=2 Then Cast(Valor AS Varchar) End),'-')+','
+IsNull(Max(Case When Nm=3 Then Cast(Valor AS Varchar) End),'-')
FROM T
GROUP BY nombre;
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

ayuda consulta sql

Publicado por Ismael (5 intervenciones) el 11/10/2012 06:33:09
Me funciono!!! gracias Isaias , me soluciono el problema. Solo el simple detalle de que queria cada valor en su propio espacio (sin comas) asi:


WITH T AS
(SELECT Row_Number() Over(Partition BY nombre ORDER BY id) Nm,
*
FROM TABLE1)
SELECT nombre,
IsNull(Max(Case When Nm=1 Then Cast(Valor AS Varchar) End),'-'),
IsNull(Max(Case When Nm=2 Then Cast(Valor AS Varchar) End),'-'),
IsNull(Max(Case When Nm=3 Then Cast(Valor AS Varchar) End),'-')
FROM T
GROUP BY nombre;


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
sin imagen de perfil
Val: 806
Bronce
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

ayuda consulta sql

Publicado por leonardo_josue (1173 intervenciones) el 10/10/2012 19:23:57
Hola Ismael...

¿Qué es lo que intentaste hacer para resolver tu problema?, supongo que al menos hiciste el intento de obtener la consulta por tu cuenta, entonces deberías colocar algo de lo que hiciste y decirnos qué problemas tienes, es decir, ¿la consulta te está marcando un error?, ¿la consulta no te está arrojando los resultados que quieres?, tienes alguna otra problemática con la que te enfrentaste.

En cuanto a lo que quieres hacer, hay distintas formas de hacerlo... una sería que clasificaras los registros, numerando del 1 al 3 para cada nombre (investiga un poco acerca de ROW_NUMBER y PARTITION BY... la idea sería tener una tabla más o menos así:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
SELECT * FROM tabla;
+------+--------+-------+-------+
| id   | nombre | valor | orden |
+------+--------+-------+-------+
|    1 | Juan   |    12 |     1 |
|    2 | Juan   |    32 |     2 |
|    3 | Juan   |    51 |     3 |
|    4 | Mario  |    58 |     1 |
|    5 | Mario  |    19 |     2 |
|    6 | Mario  |    74 |     3 |
|    7 | Melisa |    27 |     1 |
|    8 | Melisa |    58 |     2 |
|    9 | Melisa |    36 |     3 |
|   10 | Carlos |    27 |     1 |
|   11 | Carlos |    11 |     2 |
|   12 | Leo    |    11 |     1 |
+------+--------+-------+-------+


De esta manera podrías utilizar esta tabla y hacer LEFT JOIN's sobre la misma, es decir, algo como esto:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
SELECT T1.nombre, T1.valor, T2.valor, T3.valor
FROM tabla T1
LEFT JOIN tabla T2 ON T1.nombre = T2.nombre AND T2.orden = 2
LEFT JOIN tabla T3 ON T1.nombre = T3.nombre AND T3.orden = 3
WHERE T1.orden = 1;
+--------+-------+-------+-------+
| nombre | valor | valor | valor |
+--------+-------+-------+-------+
| Juan   |    12 |    32 |    51 |
| Mario  |    58 |    19 |    74 |
| Melisa |    27 |    58 |    36 |
| Carlos |    27 |    11 |  NULL |
| Leo    |    11 |  NULL |  NULL |
+--------+-------+-------+-------+


Hay muchas otras formas para hcer lo que quieres, pero creo que esta sería una de las más sencillas.

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

ayuda consulta sql

Publicado por Ismael (5 intervenciones) el 11/10/2012 06:38:53
Probe de varias formas pero al final lo logre con ROW_NUMBER y PARTITION BY... el cual veo que es de gran utilidad
gracias por contestar
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 xve
Val: 135
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

ayuda consulta sql

Publicado por xve (284 intervenciones) el 11/10/2012 08:10:13
Hola Ismael, nos puedes mostrar el código?? me gustaría mucho saber como lo lograste!!!
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

ayuda consulta sql

Publicado por Ismael (5 intervenciones) el 12/10/2012 22:29:20
Use

GO
WITH T AS
(SELECT Row_Number() Over(Partition BY nombre ORDER BY id) Nm,
*
FROM TABLE1)
SELECT nombre,
IsNull(Max(Case When Nm=1 Then Cast(Valor AS Varchar) End),'-'),
IsNull(Max(Case When Nm=2 Then Cast(Valor AS Varchar) End),'-'),
IsNull(Max(Case When Nm=3 Then Cast(Valor AS Varchar) End),'-')
FROM T
GROUP BY nombre;

El query esta bien, pero no me funciona cuando lo trato de ejecutar en java eclipse usando sql server, me da un error de sintaxis, no reconoce el GO WITH
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

ayuda consulta sql

Publicado por Ismael (5 intervenciones) el 16/10/2012 16:56:04
Si funciono quitandole el GO

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