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

De filas a columnas

Estas en el tema de De filas a columnas en el foro de SQL Server en Foros del Web. Buenas tardes, tengo un problema que no he podido resolver, tengo una tabla con los siguientes datos sucursal venta Fecha Morelia 200 20130501 Morelia 160 ...
  #1 (permalink)  
Antiguo 27/05/2013, 16:00
 
Fecha de Ingreso: mayo-2013
Mensajes: 7
Antigüedad: 11 años, 5 meses
Puntos: 0
Pregunta De filas a columnas

Buenas tardes, tengo un problema que no he podido resolver, tengo una tabla con los siguientes datos

sucursal venta Fecha
Morelia 200 20130501
Morelia 160 20130502
Morelia 500 20130503
Gudalajara 400 20130504
Gudalajara 200 20130505
Gudalajara 300 20130506
Tampico 100 20130507
Tampico 20 20130508
Tampico 670 20130509


pero quiero los datos de la siguiente forma

Sucursal 20130501 20130502 20130503
Morelia 200 160 500
Gudalajara 400 200 300
Tampico 100 20 670

podría ayudarme, soy nuevo en esto de SQL y nunca había hecho algo similar
espero su ayuda gracias

Última edición por gnzsoloyo; 27/05/2013 a las 17:04
  #2 (permalink)  
Antiguo 27/05/2013, 16:03
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 17 años, 4 meses
Puntos: 180
Respuesta: De filas a columnas

Puedes hacerlo con PIVOT o con CASE, dependiendo de tu version de SQL Server, tambien puedes ir a San Google y realizar la busqueda.
__________________
MCTS Isaias Islas
  #3 (permalink)  
Antiguo 27/05/2013, 16:17
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, 3 meses
Puntos: 774
Respuesta: De filas a columnas

como bien dijo iislas, con la funcion PIVOT lo solucionas
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #4 (permalink)  
Antiguo 27/05/2013, 17:22
 
Fecha de Ingreso: mayo-2013
Mensajes: 7
Antigüedad: 11 años, 5 meses
Puntos: 0
Respuesta: De filas a columnas

pero por lo regular he visto que con el pivot lo manejan en un grupo por meses, y yo lo quiero por dia, algun ejemplo que me pudiera servir ?
  #5 (permalink)  
Antiguo 27/05/2013, 17:35
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, 3 meses
Puntos: 774
Respuesta: De filas a columnas

por meses porque solo son 12 meses, si quieres presentar 31 columnas es tu "perro y tu lo bañas" jajajaja, es aplicar el mismo procedimiento con pivot pero usando tus columnas :)

asi no te sirve:

Código SQL:
Ver original
  1. CREATE TABLE #temp
  2. (
  3. sucursal VARCHAR(20),
  4. venta INT,
  5. fecha VARCHAR(20)
  6. )
  7. --sucursal venta Fecha
  8. INSERT INTO #temp VALUES ('Morelia', 200 ,'20130501')
  9. INSERT INTO #temp VALUES ('Morelia', 160 ,'20130502')
  10. INSERT INTO #temp VALUES ('Morelia', 500 ,'20130503')
  11. INSERT INTO #temp VALUES ('Gudalajara', 400 ,'20130504')
  12. INSERT INTO #temp VALUES ('Gudalajara', 200 ,'20130505')
  13. INSERT INTO #temp VALUES ('Gudalajara', 300 ,'20130506')
  14. INSERT INTO #temp VALUES ('Tampico', 100 ,'20130507')
  15. INSERT INTO #temp VALUES ('Tampico', 20 ,'20130508')
  16. INSERT INTO #temp VALUES ('Tampico', 670 ,'20130509')
  17.  
  18. SELECT sucursal,[20130501],[20130502],[20130503],[20130504],[20130505],[20130506],[20130507],[20130508],[20130509]
  19. FROM
  20. (
  21.    SELECT sucursal,venta,fecha FROM #temp
  22. ) AS SOURCE
  23. pivot
  24. (
  25.   SUM(venta) FOR fecha IN ([20130501],[20130502],[20130503],[20130504],[20130505],[20130506],[20130507],[20130508],[20130509])
  26. ) AS pvt
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #6 (permalink)  
Antiguo 27/05/2013, 19:38
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 17 años, 4 meses
Puntos: 180
Respuesta: De filas a columnas

"Es tu perro y tu lo bañas", no habia escuchado esa expresion, se lee bien...
__________________
MCTS Isaias Islas
  #7 (permalink)  
Antiguo 28/05/2013, 15:51
 
Fecha de Ingreso: mayo-2013
Mensajes: 7
Antigüedad: 11 años, 5 meses
Puntos: 0
Respuesta: De filas a columnas

habra una froma para no poner los dias manual mente?
  #8 (permalink)  
Antiguo 28/05/2013, 16:11
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, 3 meses
Puntos: 774
Respuesta: De filas a columnas

asi como dices que lo quieres no bueno no se me ocurre como jejejeje
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #9 (permalink)  
Antiguo 28/05/2013, 16:22
 
Fecha de Ingreso: mayo-2013
Mensajes: 7
Antigüedad: 11 años, 5 meses
Puntos: 0
Respuesta: De filas a columnas

es que esto lo estoy haciendo por que hay un sistema en la empresa el cual esta echo en FOX pro y desde ahi mandan hacer eso mediante las tablas de Fox pro y las aportaciones que tien, esto es un monitor de ventas por dia de todas las sucursales que tiene dicha empresa, el cual muestra como en el ejemplo X sucursal, su venta que ha hecho en el mes y la venta por dia de cada una de las sucursales, en el formato que les menciono, pero aqui el problema esta en que se esta haciendo todo el sistema pero en C# y pues pensaba meter los datos con esa consulta en un datagrid para que tuviera el mismo aspecto en el que esta echo en el fox, y es bastante util la forma de presentar los datos para las personas que tilizan dich informacion por eso el afan de mostrar los datos por dia y no en la suma por mes
  #10 (permalink)  
Antiguo 28/05/2013, 16:24
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, 3 meses
Puntos: 774
Respuesta: De filas a columnas

si tu informacion no esta en el formato, no queda de otra mas que formatearlo a mano...podrias hacer un query dinamico que te arme el query dependiendo los dias del mes.....pero eso ya te lo dejo a ti jejejeje....Que diablos ahi esta el query :P


Código SQL:
Ver original
  1. CREATE TABLE #temp
  2. (
  3. sucursal VARCHAR(20),
  4. venta INT,
  5. fecha VARCHAR(20)
  6. )
  7. --sucursal venta Fecha
  8. INSERT INTO #temp VALUES ('Morelia', 200 ,'20130501')
  9. INSERT INTO #temp VALUES ('Morelia', 160 ,'20130502')
  10. INSERT INTO #temp VALUES ('Morelia', 500 ,'20130503')
  11. INSERT INTO #temp VALUES ('Gudalajara', 400 ,'20130504')
  12. INSERT INTO #temp VALUES ('Gudalajara', 200 ,'20130505')
  13. INSERT INTO #temp VALUES ('Gudalajara', 300 ,'20130506')
  14. INSERT INTO #temp VALUES ('Tampico', 100 ,'20130507')
  15. INSERT INTO #temp VALUES ('Tampico', 20 ,'20130508')
  16. INSERT INTO #temp VALUES ('Tampico', 670 ,'20130509')
  17.  
  18. DECLARE @inicio datetime
  19. DECLARE @mes INT
  20. DECLARE @inicial INT
  21. DECLARE @query Nvarchar(MAX)
  22. DECLARE @cadena VARCHAR(MAX)
  23. SET @inicio='20130501'
  24. SET @inicial=DATEPART(mm,@inicio)
  25. SET @mes=DATEPART(mm,@inicio)
  26. SET @cadena=''
  27.  
  28. while @mes=@inicial
  29. BEGIN
  30.  
  31.     SELECT @cadena=@cadena + '[' + REPLACE(CONVERT(VARCHAR(20),@inicio,111),'/','') + '],'
  32. SET  @inicio=DATEADD(dd,1,@inicio)
  33. SET @mes=DATEPART(mm,@inicio)
  34. END
  35.  
  36. SET @cadena=SUBSTRING(@cadena,1,len(@cadena)-1)
  37. SET @query='
  38. select sucursal, ' + @cadena  + '
  39. from
  40. (
  41.   select sucursal,venta,fecha from #temp
  42. ) as source
  43. pivot
  44. (
  45.  sum(venta) for fecha in (' + @cadena + ')
  46. ) as pvt'
  47. EXEC sp_executesql @query
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me

Última edición por Libras; 28/05/2013 a las 16:37
  #11 (permalink)  
Antiguo 28/05/2013, 16:42
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 17 años, 4 meses
Puntos: 180
Respuesta: De filas a columnas

what the hell
__________________
MCTS Isaias Islas
  #12 (permalink)  
Antiguo 28/05/2013, 20:20
 
Fecha de Ingreso: mayo-2013
Mensajes: 7
Antigüedad: 11 años, 5 meses
Puntos: 0
Sonrisa Respuesta: De filas a columnas

aqui esta la solucion algo coomplicada pero al fin se pudo, ahora si a dormir un rato
Código SQL:
Ver original
  1. GO
  2. /******  se crea un  sp_ para cualquier tabla y cualquier dato Objeto:  StoredProcedure [dbo].[GeneratePivotQuery]    Fecha de la secuencia de comandos: 05/28/2013 20:41:25 ******/
  3. SET ANSI_NULLS ON
  4. GO
  5. SET QUOTED_IDENTIFIER ON
  6. GO
  7. ALTER proc [dbo].[GeneratePivotQuery] (
  8. @TableName VARCHAR(100), -- Table to select from
  9. @AggregateFunction VARCHAR(10), -- Aggregate to be done on the value column
  10. @ValueColumn VARCHAR(100),
  11. @PivotColumn VARCHAR(100), -- Column for which the values needs to be transposed
  12. @FilterCondition nvarchar(4000), -- Filtering to be done on choosing the pivot values
  13. @OtherColumns VARCHAR(1000)) -- Columns selected other than the pivot columns
  14. AS
  15. BEGIN
  16.  
  17. DECLARE @List VARCHAR(MAX)
  18. DECLARE @ConcatQuery nvarchar(MAX)
  19.  
  20. SET @ConcatQuery = 'select @ListOut = stuff((select distinct '',' +
  21. CHAR(10) + CHAR(9) + '['' + '+ @PivotColumn +
  22. ' + '']'' from ' + @TableName +
  23. isnull(' where ' + @FilterCondition,'') +
  24. ' for xml path('''')),1,1,'''')'
  25.  
  26. EXEC sp_executesql
  27. @ConcatQuery,
  28. N'@ListOut varchar(MAX) output',
  29. @ListOut = @List OUTPUT
  30.  
  31. /* this will print the query used to generate the pivoted result */
  32. print 'select '+ CHAR(10) + CHAR(9) + @OtherColumns + ','
  33. + @List + CHAR(10) + ' from ' + @TableName + CHAR(13) +
  34. ' pivot (' + CHAR(10) + replicate(CHAR(9),2) +
  35. @AggregateFunction + '(' + @ValueColumn +
  36. ') for ' + @PivotColumn + ' in (' +
  37. REPLACE(REPLACE(@List,CHAR(9),''),CHAR(10),'') + ')' +
  38. CHAR(13)+ CHAR(9) + CHAR(9) + ') as P' + replicate(CHAR(10),5)
  39.  
  40. /* this will generate the result set */
  41. EXEC('select '+ @OtherColumns + ',' + @List + ' from ' + @TableName +
  42. ' pivot (' + @AggregateFunction + '(' + @ValueColumn +
  43. ') for ' + @PivotColumn + ' in (' + @List + ')) as P')
  44.  
  45. END
y de esta manera se ejecuta


Código SQL:
Ver original
  1. DECLARE @TableName VARCHAR(100)
  2. DECLARE @AggregateFunction VARCHAR(10)
  3. DECLARE @ValueColumn VARCHAR(100)
  4. DECLARE @PivotColumn VARCHAR(100)
  5. DECLARE @FilterCondition nvarchar (4000)
  6. DECLARE @OtherColumns VARCHAR(1000)
  7.  
  8. SET @TableName = 'acumulado'
  9. SET @AggregateFunction = 'sum'
  10. SET @ValueColumn = 'subtotal'
  11. SET @PivotColumn = 'FECHA'
  12. SET @FilterCondition = 'FECHA between ''20130401'' and ''20130430'''
  13. SET @OtherColumns = 'sucursal'
  14.  
  15. EXECUTE [dbo].[GeneratePivotQuery]
  16. @TableName
  17. ,@AggregateFunction
  18. ,@ValueColumn
  19. ,@PivotColumn
  20. ,@FilterCondition
  21. ,@OtherColumns

Última edición por gnzsoloyo; 28/05/2013 a las 21:22 Razón: SQL mal etiquetado
  #13 (permalink)  
Antiguo 28/05/2013, 20: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, 3 meses
Puntos: 774
Respuesta: De filas a columnas

la verda no se que tiene de diferente con la solucion que te di... pero eso me saco por buena gente
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #14 (permalink)  
Antiguo 28/05/2013, 20:56
 
Fecha de Ingreso: mayo-2013
Mensajes: 7
Antigüedad: 11 años, 5 meses
Puntos: 0
Respuesta: De filas a columnas

de echo fue gracias a tu solucion lo unico que hice fue hacerlo mas global, para que pueda funconar en X tablas
  #15 (permalink)  
Antiguo 28/05/2013, 21:00
 
Fecha de Ingreso: mayo-2013
Mensajes: 7
Antigüedad: 11 años, 5 meses
Puntos: 0
Respuesta: De filas a columnas

Cita:
Iniciado por Libras Ver Mensaje
la verda no se que tiene de diferente con la solucion que te di... pero eso me saco por buena gente
muchas gracias, en verdad si me sivio de mucho tu solucion, y el dia de hoy aprendi muchas cosas, ya que solo llevo 1 mes trabajando con SQL de manera productiva, y me estoy enfrentando a cosas que no conocia, en pocas palabras soy recien egresado.

gracias y espero poder seguirte moletando para futuros problemas

gracias
  #16 (permalink)  
Antiguo 28/05/2013, 22:19
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, 3 meses
Puntos: 774
Respuesta: De filas a columnas

Cita:
Iniciado por leon8_correa9 Ver Mensaje
de echo fue gracias a tu solucion lo unico que hice fue hacerlo mas global, para que pueda funconar en X tablas
hiciste?? que lo hayas encontrado es una cosa, pero tu no lo hiciste jejeje, no me hagas caso ya es tarde y estoy divagando :P saludos y que bien que te ayudo lo que te dije :)
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #17 (permalink)  
Antiguo 29/05/2013, 00:29
 
Fecha de Ingreso: noviembre-2003
Mensajes: 209
Antigüedad: 21 años
Puntos: 0
Respuesta: De filas a columnas

Saludos a todos, en especial a Libras que ya me ha ayudado mucho... ..... espero que se compadesca de nuevo de mi.... jejeje

Intento aplicar el ejemplo a mi consulta pero la verdad no le entiendo, mi conocimiento en SQL es nivel basico :( ,.....

Tengo esta consulta:

Código SQL:
Ver original
  1. SELECT     tbl_departamentos.depto, tbl_departamentos.nombre, tbl_usuario_monto_depto.usuario, tbl_grupos_cuenta.grupo_cta
  2. FROM         tbl_departamentos INNER JOIN
  3.                       tbl_usuario_monto_depto ON tbl_departamentos.depto = tbl_usuario_monto_depto.departamento INNER JOIN
  4.                       tbl_grupos_cuenta ON tbl_usuario_monto_depto.grupo_cuenta = tbl_grupos_cuenta.grupo_cta
  5. WHERE     (tbl_departamentos.planta = @planta) AND (tbl_departamentos.activo = N'Si') AND (tbl_grupos_cuenta.activa = N'Si')

Que arroja este resultado:



Y quisiera obtener este resultado:



Mi tabla de grupo_cta tiene mas información.

Muchas gracias de verdad!!!
  #18 (permalink)  
Antiguo 29/05/2013, 11:14
 
Fecha de Ingreso: noviembre-2003
Mensajes: 209
Antigüedad: 21 años
Puntos: 0
Respuesta: De filas a columnas

Hola de nuevo, buen dia....

Con este codigo:

Código SQL:
Ver original
  1. ALTER PROCEDURE [dbo].[sp_matriz_aprobacion]
  2. @planta INT
  3.    
  4. AS
  5. BEGIN
  6.  
  7. SELECT * FROM(
  8. SELECT     tbl_departamentos.depto, tbl_departamentos.nombre, tbl_usuario_monto_depto.usuario, tbl_grupos_cuenta.grupo_cta
  9. FROM         tbl_departamentos INNER JOIN
  10.                       tbl_usuario_monto_depto ON tbl_departamentos.depto = tbl_usuario_monto_depto.departamento INNER JOIN
  11.                       tbl_grupos_cuenta ON tbl_usuario_monto_depto.grupo_cuenta = tbl_grupos_cuenta.grupo_cta) AS T
  12.                       pivot (MAX(t.usuario) FOR t.grupo_cta IN ([2000],[3000],[5000],[9000])) PVT        
  13.  
  14. END


He logrado obtener este resultado:



Y esta relativamente bien, pero lo que sucede es que los valores 2000, 3000, 5000, 9000 y otros mas, deben de ser dinamicos, dependiendo si el Grupo_cuenta (asi se llama ese campo de la tabla, donde esta 2000, 3000, etc.) esta activo o no, ademas que el campo Departamento hay mas registros y quiero mostralos todos.

Muchas gracias por su ayuda, Yo por lo mientras seguire buscando como obtener lo que necesito.

Saludos

Etiquetas: columnas, filas, sql, tabla
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 12:45.