Cómo convertir campos en filas a través de SQL en MS Access 2007 o MS SQL Server 2005

Tengo una tabla heredada de MS Access 2007 que contiene 52 campos (1 campo para cada semana del año) que representan datos históricos de ventas (más un campo para el año en realidad). Me gustaría convertir esta base de datos en una lista de tiempo / valor más convencional.

¿Alguien sabe cómo hacer eso sin escribir consultas con más de 52 parámetros explícitos?

(si existe una solución en MS SQL Server 2005, también puedo exportar / importar la tabla)

preguntado el 02 de diciembre de 08 a las 14:12

3 Respuestas

Usando PIVOT y UNPIVOT.

UNPIVOT realiza casi la operación inversa de PIVOT, rotando columnas en filas. Suponga que la tabla producida en el ejemplo anterior se almacena en la base de datos como pvty desea rotar los identificadores de columna Emp1, Emp2, Emp3, Emp4y Emp5 en valores de fila que corresponden a un proveedor en particular. Esto significa que debe identificar dos columnas adicionales. La columna que contendrá los valores de columna que está rotando (Emp1, Emp2,...) sera llamado Employee, y la columna que contendrá los valores que actualmente residen debajo de las columnas que se rotan se llamará Pedidos. Estas columnas corresponden a la columna_ pivote y columna_valor, respectivamente, en la definición de Transact-SQL. Aquí está la consulta.

--Create the table and insert values as portrayed in the previous example.
CREATE TABLE pvt (VendorID int, Emp1 int, Emp2 int,
Emp3 int, Emp4 int, Emp5 int)
GO
INSERT INTO pvt VALUES (1,4,3,5,4,4)
INSERT INTO pvt VALUES (2,4,1,5,5,5)
INSERT INTO pvt VALUES (3,4,3,5,4,4)
INSERT INTO pvt VALUES (4,4,2,5,5,4)
INSERT INTO pvt VALUES (5,5,1,5,5,5)
GO
--Unpivot the table.
SELECT VendorID, Employee, Orders
FROM 
   (SELECT VendorID, Emp1, Emp2, Emp3, Emp4, Emp5
   FROM pvt) p
UNPIVOT
   (Orders FOR Employee IN 
      (Emp1, Emp2, Emp3, Emp4, Emp5)
)AS unpvt
GO

Aquí hay un conjunto de resultados parciales.

VendorID   Employee   Orders
1      Emp1         4
1      Emp2         3
1      Emp3         5
1      Emp4         4
1      Emp5         4
2      Emp1         4
2      Emp2         1
2      Emp3         5
2      Emp4         5
2      Emp5         5
...

Respondido el 02 de diciembre de 08 a las 16:12

Gracias por esta respuesta. ¡Aprender a usar PIVOT me ahorró mucho tiempo hoy! - eric ness

Como se mencionó anteriormente, el operador UNPIVOT, si está disponible, hará esto ... Si esto no está disponible, entonces el enfoque de SQL estándar es:

Unión de varias declaraciones de selección (una para cada semana) que alias la columna de la semana específica con el mismo alias de nombre de columna

  Select 1 as week, Week1Val as value from Table
    UNION
  Select 2 as week, Week2Val as value from Table
    UNION
  Select 3 as week, Week3Val as value from Table
    UNION
 ... 
    UNION
  Select 52 as week, Week52Val as value from Table

Respondido el 02 de diciembre de 08 a las 16:12

No es necesario exportar a SQL Server. En Access, pruebe el submenú / Ver / Vista de tabla dinámica. (En cualquier caso, está en mi Access 2003). Me gusta más que el de Excel.

Respondido el 02 de diciembre de 08 a las 16:12

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.