Cómo crear matrices con SUM(IF) en MySQL
Clase 22 de 24 • Curso de SQL y MySQL 2018
Contenido del curso
Clase 22 de 24 • Curso de SQL y MySQL 2018
Contenido del curso
Jaime Ortiz
Omar Daniel Centeno
Reinaldo Mendoza
Daniel Prol
Freddy Córdova Arana
FREDDY NILSON HOME VILLA
Iván Darío Sánchez Jiménez
Reinaldo Mendoza
Emerson Y
Fredy Mendoza Vargas
Ingeborg Muñoz Carnot
José Tuzinkievicz
Jordan Sobrino Santos
Javier Diaz Morales
Daniel Hurtado
Near Mello
Erick Alay
Antoine J. Manuel Gutierrez.
Braian Peña
Monica Rodriguez Chavarro
Nestor Alonso Zaque Chala
Geovany Uribe Aguirre
Geovany Uribe Aguirre
Angel Francisco Flores Ayala
Jose Luis Medina
Angel Francisco Flores Ayala
Alejandro Cruz Martínez
Juan Sebastián Daza Vanegas
Diego Forero
Alejandro González Reyes
Javier Alejandro Quiñones Ibarra
Migrant Cyborg
Fernando Orozco Velasquez
Andres David Pinzón
Juan Sebastián Joya Rodríguez
Moises Alejandro Patiño Hernandez
"Dale con la coma" jejejeje...
jajjaa seee
Bueno que aparezca ese error, porque a veces pasamos horas sin saber cual es el error y es una cosa minima como esa
Algunos ejemplos de Super Querys (dar inteligencia a las columnas):
UPDATE authors SET nationality = "GBR" WHERE nationality = "ENG";
SELECT nationality, COUNT(book_id), SUM(IF(year < 1950, 1, 0)) AS "<1950" SUM(IF(year >= 1950 and year < 1990, 1, 0)) AS "<1990" SUM(IF(year >= 1990 and year < 2000, 1, 0)) AS "<2000" SUM(IF(year >= 2000, 1, 0)) AS "<hoy" FROM books AS b JOIN authors AS a ON a.author_id = b.author_id WHERE a.nationality IS NOT NULL GROUP BY nationality;
Gracias por tu aporte, pero para que funcione faltaron las comas entre columnas, de esta forma:
UPDATE authors SET nationality = "GBR" WHERE nationality = "ENG"; SELECT nationality, COUNT(book_id), SUM(IF(year < 1950, 1, 0)) AS"<1950", SUM(IF(year >= 1950 and year < 1990, 1, 0)) AS"<1990", SUM(IF(year >= 1990 and year < 2000, 1, 0)) AS"<2000", SUM(IF(year >= 2000, 1, 0)) AS"<hoy" FROM books AS b JOIN authors AS a ON a.author_id = b.author_id WHERE a.nationality IS NOT NULL GROUP BY nationality;
Faltaron las comas, pero sirve como aprendizaje para ir conociendo los errores.
Llevo años usando MySQL y este curso a mejorado notablemente mis competencias, precisamente hoy requerí crear una matriz y lo hice directamente desde la BD con SQL y no desde la capa de programacion, me ahorro multiples query uno por cada columna de la tabla.
Genial, pensaba en ahorrarme algo de codigo usando estos comandos tambien
Resumen de la clase:
-- SUM(), para sumar cada valor(1) en una tupla SELECT COUNT(book_id), SUM(IF(year < 1950, 1, 0)) AS `<1950`, SUM(IF(year >= 1950 AND year < 1990, 1, 0)) AS `<1990`, SUM(IF(year >= 1990 AND year < 2000, 1, 0)) AS `<2000`, SUM(IF(year >= 2000, 1, 0)) AS `<hoy` FROM books; -- Agrupar el query anterior y mostrar su nacionalidad SELECT nationality, COUNT(book_id), SUM(IF(year < 1950, 1, 0)) AS `<1950`, SUM(IF(year >= 1950 AND year < 1990, 1, 0)) AS `<1990`, SUM(IF(year >= 1990 AND year < 2000, 1, 0)) AS `<2000`, SUM(IF(year >= 2000, 1, 0)) AS `<hoy` FROM books AS b JOIN authors AS a ON a.author_id = b.author_id WHERE a.nationality IS NOT NULL GROUP BY nationality;
Gracias
Creo que para este ejemplo quizás hubiese sido más elegante utilizar el operador between:
SELECT COUNT(book_id), SUM(IF(year < 1950, 1,0)) as '<1950', SUM(IF(year between 1950 and 1990, 1,0)) as '<1990', SUM(IF(year between 1990 and 2000,1,0)) as '<2000', SUM(IF(year between 2000 and YEAR(NOW()),1,0)) as '<hoy' FROM books;
+----------------+-------+-------+-------+------+ | count(book_id) | <1950 | <1990 | <2000 | <hoy | +----------------+-------+-------+-------+------+ | 197 | 186 | 1 | 8 | 2 | +----------------+-------+-------+-------+------+
Si quieres usar between debes usar en la primera condición, por ejemplo
between 1950 and 1989
ya que between incluye a los extremos
Fijate que Beco puso year < 1990 no year <= a 1990
Query:
en el error del profesor en el 10:40 cuando corrige solo como comentario, no era la coma, era los parentesis, abrió 2 parentesis y le faltaba cerrar 1, los parentesis funcionan como en excel, si abres 4 tienes que cerrar los 4.
"Y dale con la coma" El día a día de todo programador jajajaja
sin duda la clase que mas me impresiono, con unas cuantas lineas nuevas de comando, en sql se puede crear un análisis tremendo de los datos , y eso sin contar que no estamos trabajando con la tabla transacciones, por que con esa tabla se podrian sacar cosas del tipo, que mes se venden mas libros, de que autores suelen comprar los adolecentes , y si la base de datos es lo suficientemente grande , se pueden sacar conclusiones del tipo "los generos de libros que conocemos en la adolecencia se quedan para siempre?" o cuantos usuarios compran el mismo libro pero en diferentes idiomas etc
Y empezamos a entrar al mundo de Data Science, una gran forma de verlo, dado que las DB están muy relacionadas a este mundo y eso simplemente, es fascinante.
select name, sum(if(year(birthdate) < 1990, 1, 0)) AS "viejos", sum(if(year(birthdate) < 1990, 0, 1)) AS "jovenes" from clients group by name order by name ASC;``` se que es rebuscado ver quienes nacen antes y despues de 1990 pero lo importante es el codigo!!
La verdad que este curso hace ver sql como algo que se puede llevar mas alla.
Tremenda energía Alberto Alcocer ¡ =)
Yo trabajé en este otro query con el fin de saber el inventario por nacionalidad: SELECT A.nationality, SUM(B.copies) AS 'INVENTARIO', SUM(IF(B.year < 1950, B.copies, 0)) AS '<1950', SUM(IF(B.year >= 1950 AND B.year < 1990, B.copies, 0)) AS '<1990', SUM(IF(B.year >= 1990 AND B.year < 2000, B.copies, 0)) AS '<2000', SUM(IF(B.year >= 2000, B.copies, 0)) AS 'HOY' FROM books AS B JOIN authors AS A ON B.author_id = A.author_id GROUP BY A.nationality ORDER BY INVENTARIO DESC;
++Cuando lo intento correr me dice:++ ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '?INVENTARIO?, SUM(IF(B.year < 1950, B.copies, 0)) AS ?<1950?, SUM(IF(B.year >= 1' at line 1
Ya, cambiando comillas simples por comillas dobles me funcionó:
SELECT A.nationality, SUM(B.copies) AS INVENTARIO, SUM(IF(B.year < 1950, B.copies, 0)) AS “<1950”, SUM(IF(B.year >= 1950 AND B.year < 1990, B.copies, 0)) AS “<1990”, SUM(IF(B.year >= 1990 AND B.year < 2000, B.copies, 0)) AS “<2000”, SUM(IF(B.year >= 2000, B.copies, 0)) AS “<HOY” FROM books AS B JOIN authors AS A ON B.author_id = A.author_id GROUP BY A.nationality ORDER BY INVENTARIO DESC;
Consultas tan elaboradas como esta y que pueden llegar a ser muy repetidas conviene guardaralas en una vista. Las vistas generan tablas a partir de las sentencias de SQL, y pueden ejecutarse a partir de su nombre unicamente.
-- Con esto puedes crear la vista que quedará guardada. CREATE VIEW books_nationality_year AS SELECT a.nationality, COUNT(book_id) AS 'Total', SUM(IF(year < 1950, 1, 0)) as `< 1950`, SUM(IF(year < 1990 and year >= 1950, 1, 0)) as `< 1990`, SUM(IF(year < 2000 and year >= 1990, 1, 0)) as `< 2000`, SUM(IF(year >= 2000, 1, 0)) as `hoy` FROM books as b JOIN authors as a ON b.author_id = a.author_id WHERE a.nationality IS NOT NULL GROUP BY nationality; -- Con esto ejecutas la vista SELECT * FROM books_nationality_year;
Esas vistas solo se guardan dentro de la base datos? O se puede progrmar desde algun lenguaje? Funciona para sqlite o solo sql server?
Hola Jose, en el caso de MySQL se guardaría en la base de datos, desconozco si puedan aplicarse de la misma forma en SQLite o SQL Server, toca revisar su documentación, pero sin duda deben de tener su equivalente.
-- con este query pueden saber cuantos vendidos y cuantos no select COUNT(book_id) AS Total, SUM(IF(sellable = 0, 1, 0)) AS No_vendido, SUM(IF(sellable = 1, 1, 0)) AS Vendido FROM books;```
Dado que Beco dice que le preocuparía si el Super Query demora más de 0.01 segundos en completar, ¿qué razones son las causantes de que mi query demore 0.02 segundos o más (es decir, más de 0.01 segundos)? Me pasó más de una vez probando los querys del curso. Tuve tiempos de hasta 0.05 segundos.
Depende mucho de las especificaciones de tu computador y los procesos que se encuentren corriendo en el, por ejemplo si estas viendo la clase mientras ejecutas la query el procesador esta no solo haciendo la query sino mostrando el video lo que hace que los recursos no sean exclusivos para mysql.
Posiblemente tu procesador es de 32 bits
Poca memoria RAM
Aplicaciones simultaneas ejecutandose (vídeo, mysql)
terminando el curso a poner en práctica todo lo aprendido, gracias Alberto Alcocer!
La razón por la que aparece ARG en el min 13:27 es porque somos los campeones del mundo!
Muchachooos!!! 🇦🇷
Excelente explicación, yo soy uno de los que en php obtengo un listado de resultados y los recorro en un each, foreach ... y modifico, creo o calculo, filas para mostrar, pero sabiendo aprovechar las funciones o trucos en sql, optimiza muchísimo el tiempo de respuesta.
realmente el valor en esta clase es analogo al del curso de javascript, en donde tu puedes traer toda la infor y usar un for para organizarla, o puedes usar funciones como map y filter.
Es asi que, tu puedes traer toda la info y analizarla usando un backend language, pero son mas lineas de codigo y mas trabajo qeu te puedes ahorrar desde el query
realmente no es tanto por el tiempo que te ahorras escribiendo codigo si no ,que el tiempo de compilacion de codigo ,se reduce drasticamente ,porque lo haces directamente desde la base de datos, muchas de las cosas que hizo en el curso se puede hacer con lenguajes de backend,pero si te puedes ahorrar escribir codigo en el backend mejor.