tabla sintaxis query queries generating generar from entre diferencias desde crear sql mysql statistics reshape

sintaxis - html en sql server



Mysql, remodelar datos de largo/alto a ancho (3)

Creo que encontré la solución, que usa VIEWS e INSERT INTO (como lo sugiere e4c5).

Tienes que obtener tu lista de AttrNames / Keys tú mismo, pero MYSQL hace el otro trabajo pesado.

Para el caso de prueba simple anterior, cree la tabla nueva con las columnas apropiadas (no olvide tener también una clave primaria de incremento automático). Entonces

CREATE VIEW a AS SELECT country, attrValue WHERE attrName="President"; CREATE VIEW b AS SELECT country, attrValue WHERE attrName="Currency"; INSERT INTO newtable(country, President, Currency) SELECT a.country, a.attrValue, b.attrValue FROM a INNER JOIN b ON a.country=b.country;

Si tiene más attrNames, cree una vista para cada uno y luego ajuste la última declaración en consecuencia.

INSERT INTO newtable(country, President, Currency, Capital, Population) SELECT a.country, a.attrValue, b.attrValue, c.attrValue, d.attrValue FROM a INNER JOIN b ON a.country=b.country INNER JOIN c ON a.country=c.country INNER JOIN d ON a.country=d.country;

Algunos consejos más

  • use NATURAL LEFT JOIN y no tiene que especificar la cláusula ON

Tengo datos en una tabla mysql en formato largo / alto (descrito a continuación) y quiero convertirlos a formato ancho. ¿Puedo hacer esto usando sólo SQL?

Más fácil de explicar con un ejemplo. Supongamos que tiene información sobre (país, clave, valor) para M países, N claves (por ejemplo, las claves pueden ser ingresos, líder político, área, continente, etc.)

Long format has 3 columns: country, key, value - M*N rows. e.g. ''USA'', ''President'', ''Obama'' ... ''USA'', ''Currency'', ''Dollar'' Wide format has N=16 columns: county, key1, ..., keyN - M rows example: country, President, ... , Currency ''USA'', ''Obama'', ... , ''Dollar''

¿Hay alguna forma en SQL para crear una nueva tabla con los datos en formato ancho?

select distinct key from table;

// Esto me dará todas las llaves.

1) ¿Cómo creo la tabla utilizando estos elementos clave?

2) ¿Cómo luego relleno los valores de la tabla?

Estoy bastante seguro de que puedo hacer esto con cualquier lenguaje de scripting (me gusta python), pero quería saber si hay una forma fácil de hacerlo en mysql. Muchos paquetes estadísticos como R y STATA tienen este comando incorporado porque a menudo se usa.

======

Para ser más claros, aquí está la salida de entrada deseada para un caso simple:

Entrada:

country attrName attrValue key (these are column names) US President Obama 2 US Currency Dollar 3 China President Hu 4 China Currency Yuan 5

Salida

country President Currency newPkey US Obama Dollar 1 China Hu Yuan 2


Si estuviera usando SQL Server, sería fácil usar UNPIVOT . Por lo que yo sé, esto no está implementado en MySQL, por lo que si quiere hacer esto (y no lo recomiendo) probablemente tendrá que generar el SQL dinámicamente, y eso es un desastre.


Tablas cruzadas o tablas dinámicas es la respuesta. Desde allí puede SELECCIONAR DE ... INSERTAR EN ... o crear una VISTA desde el SELECT único.

Algo como:

SELECT country, MAX( IF( key=''President'', value, NULL ) ) AS President, MAX( IF( key=''Currency'', value, NULL ) ) AS Currency, ... FROM table GROUP BY country;

Para obtener más información, http://dev.mysql.com/tech-resources/articles/wizard/index.html