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

Agrupacion

Estas en el tema de Agrupacion en el foro de SQL Server en Foros del Web. Hola Soy un novato en lo que es Sql y tengo un problema tengo mi tabla Llamada cuenta la cual tiene los siguientes campos: Id,Codigo,Descripcion,PadreId. ...
  #1 (permalink)  
Antiguo 03/04/2014, 09:31
 
Fecha de Ingreso: marzo-2014
Mensajes: 5
Antigüedad: 10 años, 8 meses
Puntos: 0
Exclamación Agrupacion

Hola
Soy un novato en lo que es Sql y tengo un problema tengo mi tabla Llamada cuenta la cual tiene los siguientes campos: Id,Codigo,Descripcion,PadreId.

Yo quiero agurpar todas las cuentas segun el padre por ejemplo

Tabla Cuenta
|Id | Codigo |Descricion | PadreId
|1 | 5 | Gastos | null
|2 | 6-2 | Aportes | 7
|3 |6-1 | Servicios | 7
|4 |5-1 | Sueldos | 1
|5 |5-1-1 | Asesorias | 4
|6 |5-2 | Otros | 1
|7 |6 | programas | null


La tabla ya agrupada me tendria que salir de la siguiente manera:

Tabla cuenta agrupada

|Id | Codigo |Descricion | PadreId
|1 | 5 | Gastos | null
|4 |5-1 | Sueldos | 1
|5 |5-1-1 | Asesorias | 4
|6 |5-2 | Otros | 1
|7 |6 | programas | null
|3 |6-1 | Servicios | 7
|2 | 6-2 | Aportes | 7


Pero al momento que hago la agrupacion el resultado que me da es algo asi:


Tabla cuenta agrupada Incorrectamente

|Id | Codigo |Descricion | PadreId
|1 | 5 | Gastos | null
|4 |5-1 | Sueldos | 1
|7 |6 | programas | null
|3 |6-1 | Servicios | 7
|5 |5-1-1 | Asesorias | 4
|6 |5-2 | Otros | 1
|2 | 6-2 | Aportes | 7

Alguien podria darme Una mano Se los Agradesco de antemano
  #2 (permalink)  
Antiguo 03/04/2014, 10:51
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 18 años, 4 meses
Puntos: 774
Respuesta: Agrupacion

tu lo que quieres es ordenar los datos segun el padre...o que aparezcan ordenados como les corresponde, para eso puedes usar lo siguiente:

Código SQL:
Ver original
  1. CREATE TABLE #temp
  2. (
  3. id INT,
  4. codigo VARCHAR(20),
  5. padreid INT
  6. )
  7.  
  8. INSERT INTO #temp VALUES (1 , '5' , NULL)
  9. INSERT INTO #temp VALUES (2 , '6-2' , 7)
  10. INSERT INTO #temp VALUES (3 ,'6-1' ,  7)
  11. INSERT INTO #temp VALUES (4 ,'5-1' , 1)
  12. INSERT INTO #temp VALUES (5 ,'5-1-1' ,  4)
  13. INSERT INTO #temp VALUES (6 ,'5-2' ,  1)
  14. INSERT INTO #temp VALUES (7 ,'6' ,  NULL)
  15.  
  16.  
  17. SELECT * INTO #temp2 FROM(
  18. SELECT
  19. t1.id,t1.padreid,t1.codigo,t2.padreid AS padre2,t2.id AS id2,t2.codigo AS codigo2
  20. FROM #temp AS t1
  21. LEFT JOIN #temp AS t2 ON (t1.id=t2.padreid)
  22. WHERE t2.padreid IS NOT NULL
  23. ) AS completa
  24.  
  25. SELECT id AS padre ,padreid AS id,codigo FROM (
  26. SELECT *,ROW_NUMBER() OVER(partition BY codigo ORDER BY id) AS rn FROM
  27. (
  28. SELECT id,padreid,codigo FROM #temp2
  29. UNION
  30. SELECT padre2,id2,codigo2 FROM #temp2
  31. ) AS query
  32. ) query2 WHERE rn=1

y obtienes lo que necesitas :)

saludos!
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #3 (permalink)  
Antiguo 03/04/2014, 14:47
 
Fecha de Ingreso: marzo-2014
Mensajes: 5
Antigüedad: 10 años, 8 meses
Puntos: 0
Respuesta: Agrupacion

Hola muchas gracias por tu ayuda el problema que tengo es que no debo de utilizar tablas temporales en vez de eso debo usar variables de tipo tabla intente idearmelas con el codigo que esta aqui pero no pude por mas vueltas que le di al momento de pasar el codigo con lo que yo necesito no me da Podrian ayudarme
  #4 (permalink)  
Antiguo 03/04/2014, 15:43
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 18 años, 4 meses
Puntos: 774
Respuesta: Agrupacion

al cliente lo que pida:

Código SQL:
Ver original
  1. DECLARE @temp TABLE
  2. (
  3. id INT,
  4. codigo VARCHAR(20),
  5. padreid INT
  6. )
  7.  
  8. INSERT INTO @temp VALUES (1 , '5' , NULL)
  9. INSERT INTO @temp VALUES (2 , '6-2' , 7)
  10. INSERT INTO @temp VALUES (3 ,'6-1' ,  7)
  11. INSERT INTO @temp VALUES (4 ,'5-1' , 1)
  12. INSERT INTO @temp VALUES (5 ,'5-1-1' ,  4)
  13. INSERT INTO @temp VALUES (6 ,'5-2' ,  1)
  14. INSERT INTO @temp VALUES (7 ,'6' ,  NULL)
  15.  
  16. DECLARE @temp2 TABLE
  17. (
  18. id INT,
  19. padreid INT,
  20. codigo VARCHAR(20),
  21. padre2 INT,
  22. id2 INT,
  23. codigo2 VARCHAR(20)
  24. )
  25.  
  26. INSERT INTO @temp2
  27. SELECT
  28. t1.id,t1.padreid,t1.codigo,t2.padreid AS padre2,t2.id AS id2,t2.codigo AS codigo2
  29. FROM @temp AS t1
  30. LEFT JOIN @temp AS t2 ON (t1.id=t2.padreid)
  31. WHERE t2.padreid IS NOT NULL
  32.  
  33.  
  34. SELECT id AS padre ,padreid AS id,codigo FROM (
  35. SELECT *,ROW_NUMBER() OVER(partition BY codigo ORDER BY id) AS rn FROM
  36. (
  37. SELECT id,padreid,codigo FROM @temp2
  38. UNION
  39. SELECT padre2,id2,codigo2 FROM @temp2
  40. ) AS query
  41. ) query2 WHERE rn=1

como son variables de tipo tabla se ejecuta todo el script de una sola vez :) y el resultado es:

padre id codigo
----------- ----------- --------------------
1 NULL 5
1 4 5-1
4 5 5-1-1
1 6 5-2
7 NULL 6
7 3 6-1
7 2 6-2
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #5 (permalink)  
Antiguo 03/04/2014, 18:05
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 17 años, 5 meses
Puntos: 180
Respuesta: Agrupacion

Increíble !!!!, cuanta paciencia, en verdad que se le admira..........
__________________
MCTS Isaias Islas

Etiquetas: agrupacion, ordenada, sql-sentencia
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 14:45.