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

Organizar períodos por bimestre

Estas en el tema de Organizar períodos por bimestre en el foro de SQL Server en Foros del Web. Hola, cómo están? Les cuento, tengo la siguiente tabla: TipoCanal Período %Vol Super Ago 7 Hiper Ago 12 Mercal Ago 25 Super Sep 15 Hiper ...
  #1 (permalink)  
Antiguo 27/10/2011, 13:38
 
Fecha de Ingreso: octubre-2011
Mensajes: 4
Antigüedad: 13 años
Puntos: 0
Organizar períodos por bimestre

Hola, cómo están? Les cuento, tengo la siguiente tabla:

TipoCanal Período %Vol
Super Ago 7
Hiper Ago 12
Mercal Ago 25
Super Sep 15
Hiper Sep 32
Mercal Sep 18
Super Oct 41
Hiper Oct 20
Mercal Oct 7
Super Nov 15
Hiper Nov 21
Mercal Nov 9

Y deseo convertirla en la siguiente tabla:

TipoCanal Bimestre 1 (Ago-Sep) Bimestre 2 (Oct-Nov)
Super Promedio %Vol Promedio %Vol
Hiper Promedio %Vol Promedio %Vol
Mercal Promedio %Vol Promedio %Vol

He intentado con group by y con cases pero de verdad ya no encuentro que mas hacer. Si me pudieran ayudar con un query que me pueda dar un resultado parecido mucho se los agradecería.

Saludos y gracias de antemano.
  #2 (permalink)  
Antiguo 27/10/2011, 14:39
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: Organizar períodos por bimestre

Código SQL:
Ver original
  1. CREATE TABLE #temp
  2. (
  3. tipocanal VARCHAR(20),
  4. periodo VARCHAR(10),
  5. vol INT
  6. )
  7. INSERT INTO #temp VALUES ('Super','Ago',7)
  8. INSERT INTO #temp VALUES ('Hiper','Ago',12)
  9. INSERT INTO #temp VALUES ('Mercal','Ago',25)
  10. INSERT INTO #temp VALUES ('Super','Sep',15)
  11. INSERT INTO #temp VALUES ('Hiper','Sep',32)
  12. INSERT INTO #temp VALUES ('Mercal','Sep',18)
  13. INSERT INTO #temp VALUES ('Super','Oct',41)
  14. INSERT INTO #temp VALUES ('Hiper','Oct',20)
  15. INSERT INTO #temp VALUES ('Mercal','Oct',7)
  16. INSERT INTO #temp VALUES ('Super','Nov',15)
  17. INSERT INTO #temp VALUES ('Hiper','Nov',21)
  18. INSERT INTO #temp VALUES ('Mercal','Nov',9)
  19.  
  20.  
  21. SELECT tipocanal,SUM(isnull(bimestre1,0)) Bimestre1 ,SUM(isnull(bimestre2,0)) Bimestre2,SUM(isnull(bimestre3,0)) Bimestre3,
  22. SUM(isnull(bimestre4,0)) Bimestre4,SUM(isnull(bimestre5,0))Bimestre5,SUM(isnull(bimestre6,0))Bimestre6
  23. FROM
  24. (
  25. SELECT
  26. tipocanal,
  27. CASE WHEN periodo='Ene' OR periodo='Feb' THEN SUM(vol) END AS Bimestre1,
  28. CASE WHEN periodo='Mar' OR periodo='Abr' THEN SUM(vol) END AS Bimestre2,
  29. CASE WHEN periodo='May' OR periodo='Jun' THEN SUM(vol) END AS Bimestre3,
  30. CASE WHEN periodo='Jul' OR periodo='Ago' THEN SUM(vol) END AS Bimestre4,
  31. CASE WHEN periodo='Sep' OR periodo='Oct' THEN SUM(vol) END AS Bimestre5,
  32. CASE WHEN periodo='Nov' OR periodo='Dic' THEN SUM(vol) END AS Bimestre6
  33. FROM #temp
  34. GROUP BY tipocanal,periodo
  35. ) t1 GROUP BY tipocanal
  36.  
  37. Resultado:
  38.  
  39. tipocanal   Bimestre1   Bimestre2   Bimestre3   Bimestre4   Bimestre5   Bimestre6
  40. Hiper   0   0   0   12  52  21
  41. Mercal  0   0   0   25  25  9
  42. Super   0   0   0   7   56  15

Si me pudieras ayudar con minimo un gracias mucho te lo agradeceria :)
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #3 (permalink)  
Antiguo 28/10/2011, 11: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: Organizar períodos por bimestre

Hennert, y sirvio o no sirvio el codigo???
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #4 (permalink)  
Antiguo 31/10/2011, 07:47
 
Fecha de Ingreso: octubre-2011
Mensajes: 4
Antigüedad: 13 años
Puntos: 0
Respuesta: Organizar períodos por bimestre

Estuvo perfecto Libras. Muchas gracias. Tuve que hacerle una adaptación pues la data del Volumen era traída tras cálculos con dos tablas distintas y tuve que realizar algunos Join pero todo perfecto.

De todas formas, para entender mejor tu query, el primer SELECT lo haces para eliminar los espacios en blanco que se generan cierto?

Por ejemplo, en una tabla de este estilo, cómo eliminaría los espacios en blanco?:

Julio Agosto tipocanal
5% null Tradicional
5% null Abastos
9% null Bodegas
null 3% Tradicional
null 4% Abastos
null 9% Bodegas

Última edición por Hennert; 31/10/2011 a las 07:52
  #5 (permalink)  
Antiguo 31/10/2011, 11:18
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: Organizar períodos por bimestre

Primero tendrias que convertir tus valores de % a entero en este caso quitar el simbolo de % para que puedas hacer la suma de los valores ya despues nada mas harias:

Código SQL:
Ver original
  1. CREATE TABLE #temp
  2. (
  3. julio VARCHAR(20),
  4. agosto VARCHAR(20),
  5. tipocanal VARCHAR(20)
  6. )
  7.  
  8.  
  9. INSERT INTO #temp VALUES ('5%', NULL ,'Tradicional')
  10. INSERT INTO #temp VALUES ('5%', NULL, 'Abastos')
  11. INSERT INTO #temp VALUES ('9%', NULL, 'Bodegas')
  12. INSERT INTO #temp VALUES (NULL, '3%', 'Tradicional')
  13. INSERT INTO #temp VALUES (NULL, '4%', 'Abastos')
  14. INSERT INTO #temp VALUES (NULL, '9%', 'Bodegas')
  15.  
  16. SELECT SUM(isnull(CONVERT(INT,julio),0)) AS julio, SUM(isnull(CONVERT(INT,agosto),0)) AS agosto, tipocanal FROM
  17. (
  18. SELECT REPLACE(julio,'%','') AS julio, REPLACE(agosto,'%','') AS agosto, tipocanal FROM #temp
  19. ) t1 GROUP BY tipocanal
  20.  
  21. Aqui el resultado:
  22.  
  23. julio   agosto  tipocanal
  24. 5   4   Abastos
  25. 9   9   Bodegas
  26. 5   3   Tradicional

Saludos!
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #6 (permalink)  
Antiguo 31/10/2011, 14:20
 
Fecha de Ingreso: octubre-2011
Mensajes: 4
Antigüedad: 13 años
Puntos: 0
Respuesta: Organizar períodos por bimestre

Listo! A continuación lo que hice para el primer y para el segundo caso:

Caso 1 (Semestres):

SELECT destipocanal, (sum(isnull(ISEM09,0))/6) ISEM09, (sum(isnull(IISEM09,0))/6) IISEM09, (sum(isnull(ISEM10,0))/6) ISEM10, (sum(isnull(IISEM10,0))/6) IISEM10, (sum(isnull(ISEM11,0))/6) ISEM11
FROM
(
SELECT rcntc.destipocanal,
case when rcntc.codigoperiodoqq between '63' and '68' then avg(rcntc.totalvolumen/rcn.totalvolumen) end AS ISEM09,
case when rcntc.codigoperiodoqq between '69' and '74' then avg(rcntc.totalvolumen/rcn.totalvolumen) end AS IISEM09,
case when rcntc.codigoperiodoqq between '75' and '80' then avg(rcntc.totalvolumen/rcn.totalvolumen) end AS ISEM10,
case when rcntc.codigoperiodoqq between '81' and '86' then avg(rcntc.totalvolumen/rcn.totalvolumen) end AS IISEM10,
case when rcntc.codigoperiodoqq between '87' and '92' then avg(rcntc.totalvolumen/rcn.totalvolumen) end AS ISEM11
FROM resumencategorianacionalseguntipocanalqq as rcntc join resumencategorianacionalqq as rcn on (rcntc.codigocategoria = rcn.codigocategoria AND rcntc.codigoperiodoqq = rcn.codigoperiodoqq)
WHERE rcntc.codigocategoria=2 AND rcntc.codigoperiodoqq > 62 AND rcntc.destipocanal in ('Supermercado Independiente', 'Mercal', 'Tradicional', 'Mercados', 'Bodegas', 'Supermercado Cadena', 'Abastos', 'Hipermercado', 'Bicentenario')
GROUP BY rcntc.destipocanal, rcntc.codigoperiodoqq
) t1 GROUP BY destipocanal

Caso 2 (Meses):

SELECT sum(isnull(Julio,0)) Julio, sum(isnull(Agosto,0)) Agosto, sum(isnull(Septiembre,0)) Septiembre
FROM
(
SELECT rcntc.destipocanal,
case when rcntc.codigoperiodoqq=93 then (rcntc.totalvolumen/rcn.totalvolumen) end AS Julio,
case when rcntc.codigoperiodoqq=94 then (rcntc.totalvolumen/rcn.totalvolumen) end AS Agosto,
case when rcntc.codigoperiodoqq=95 then (rcntc.totalvolumen/rcn.totalvolumen) end AS Septiembre
FROM resumencategorianacionalseguntipocanalqq as rcntc join resumencategorianacionalqq as rcn on (rcntc.codigocategoria = rcn.codigocategoria AND rcntc.codigoperiodoqq = rcn.codigoperiodoqq)
WHERE rcntc.codigocategoria=2 AND rcntc.codigoperiodoqq > '92' AND rcntc.codigoperiodoqq < '96' AND rcntc.destipocanal in ('Supermercado Independiente', 'Mercal', 'Tradicional', 'Mercados', 'Bodegas', 'Supermercado Cadena', 'Abastos', 'Hipermercado', 'Bicentenario')
) t1 GROUP BY destipocanal

Muchas gracias por tu ayuda Libras! Saludos!

Etiquetas: queries, sql, sqlserver2005, bases-de-datos
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 16:37.