Northwingx
Parte 1
-- Seleccione todos los atributos de la tabla clientes cuyo pais es usa o uk
select *
from customers
where country in ('USA', 'UK')
-- Seleccione todos los atributos de la tabla clientes cuya region es null
select *
from customers
where region is null
-- seleccione todos los atributos de la tabla donde la region de los clientes no es null
select*
from customers
where not (region is null)
--seleccione todos los atributos de la tabla clientes con nombre de compañia que contiene las letras "por"
select*
from customers
where CompanyName like '%por%' --para buscar letras se usa el % al final y al inicio de las letras
-- Seleccione todos los atributos de la tabla clientes con nombre Fr
select *
from Customers
where CompanyName like '%Fr%'
-- Seleccione todos los atributos de la tabla clientes con nombre de compañia que la primera letra no
-- importa cual sea pero la segunda sea "r" y el resto de letras que sea cualquier
select *
from Customers
where CompanyName like '_a%' --para buscar la segunda letra
-- Seleccione todos los atributos de la tabla empleados que tienen su id entre los valores 3 y 7
select *
from Employees
where EmployeeID between 3 and 7
select *
from Customers
where ContactName between '%a%' and '%z%'
-- Seleccione todos los atributos de la tabla clientes ordenado por nombre de contacto de la compañia alfabeticamente
select *
from Customers
order by ContactName --para colocar en oden alfabeticamente
-- Seleccione todos los atributos de la tabla ordenes ordenados por fecha de orden pero en forma descendente
select *
from Orders
order by OrderDate desc --ordenar de forma descendente
--Obetener todos los productos cuyo nombre comienza con la letra p y tienen un precio unitario comprendido entre 10 y 120
select *
from Products
where ProductName like 'p%' and UnitPrice between 10 and 120 --se pone el p% el % al final para ponerproductos donde empieza con la p
--Obetener todos los clientes de los paises de usa francia uk
select *
from customers
where country in ('USA', 'UK', 'France')
order by Country
--seleccione todos los productos descontinuados y sin stock y que pertenecen a la categoria 1 3 4 y 7
select *
from Products
where (Discontinued = 1 and UnitsInStock = 0) and CategoryID in (1,3,4,7)
--Obtener todas las ordenes hechas por el empleado por codigo 2 5 y 7
Select *
from Orders
where EmployeeID in (2,5,7) and YEAR(orderdate ) ='1996'
/*sintaxis obetener el año*/ = year(orderdate) = 1997
/*sintaxis */
--Obetener todos los clientesque cuenten con fax
select*
from Customers
where not (Fax is null)
--Obetener todos los clientesque no cuente con fax y que sean de estados unidos
select*
from Customers
where Fax is null and Country = 'USA'
--Obetener todos los clientes que cuenten con un jefe
select*
from Employees
where not (ReportsTo is null)
Parte 2
select ShipCity, count(*) --Cuenta por cada ciudad los envios
from Orders
group by ShipCity -- Ordena por ciudad
--ahora queremos saber cuanto ha costado el envio
select ShipCity, COUNT(*), SUM(freight) --freight significa transporte
/*Count significa contar los valores de una columna
Sintaxis: count(*)*/
from Orders
group by ShipCity
--si queremos ponerle un valor como soles o cantidad por ejemplo que en los recuadros se usen de titulo soles se usan los alias
select ShipCity, COUNT(*) as cantidad, SUM(freight) as soles --freight significa transporte
from Orders
group by ShipCity
--con más valores
select ShipCity, COUNT(*) as cantidad, SUM(freight) as soles, MIN(freight), avg(freight), max(freight) --freight significa transporte
from Orders
group by ShipCity
--
Select ShipCity, count(*) as cantidad, sum(freight) as soles, Min(freight), avg(freight), max(freight)
From Orders
group by ShipCity
Having sum(freight)> 1000
--
--en el caso de la region podemos ver valores nules y otros, que pasa si lo queremos
--reemplazar por valores que nosotros queramos
--cambiaremos los null en blanco, los LA en latino y los demás lo vamos a dejar así
select * from Suppliers
select CompanyName,
case when Region is null then ''
when region = 'LA' then 'Latino'
else 'OTRO' end,
Region -- de que dato vamos a tomar
from Suppliers --lo vamos a jalar de este campo
Código Profesor
/*
Consultas con agrupación de datos
Consultas usando GROUP BY // SUM, AVG, MAX, MIN, COUNT // HAVING
*/
SELECT *
FROM Orders
/*
Queremos saber cuantos envios(Orders) hay por ciudad, ¿Cómo podríamos agruparlos?
para eso viene en nuestra ayuda el operador Group By.
Nosotros tenemos que indicar porque queremos agrupar.
Si nosotros queremos saber por cada ciudad cuantos envios ha habido,
podemos agrupar por ShipCity, tendriamos que contar cuantos hay, para eso
utilizaremos el agrupador COUNT, con este agrupador vamos a contar, el * indica que tome cualquier valor.
COUNT.- Esta función devuelve el número de filas de la consulta, es decir, el número de registros que
cumplen una determinada condición.
*/
SELECT *, count(*)
FROM Orders
GROUP BY ShipCity
/*
Aca vamos a tener un primer error, porque nosotros estamos agrupando por ShipCity y si ponemos el *
pone todos los atributos. Aquí viene la duda del SQL, y el codigo de orden que hago con el,
como lo muestro, no sabe y finalmente te muestra un error.
*/
SELECT ShipCity, count(*)
FROM Orders
GROUP BY ShipCity
/*
Aquellos campos que voy agrupar los puedo poner aca ShipCity, porque gracias a esta parte
Group By ShipCity, yo le indico, yo necesito que lo agrupes por eso.
Al ponerlo aca Select ShipCity aparece una única vez por cada registro, es decir Anchen
aparece en todos estos registros una unica vez, lo mismo con el resto, y la otra columna
hace un calculo, en este caso esta contando, siginfica que hay 6 ordenes que se van a ir
a Anchen y así sucesivamente.
Queremos saber cuanto nos ha costado el envio a cada una de estas ciudades en total
Freight = transporte
Nos va a aumentar el total de soles o dolares que nos costó enviar las 6 ordenes y así sucesívamente.
*/
Select ShipCity, count(*), sum(freight)
From orders
Group by ShipCity
/*
Vamos a mejorarlo un poco mas, aca no sale ningun nombre de columna porque es un campo calculado,
si quisieramos ponerle un valor le pondriamos as soles y as cantidad.
*/
Select ShipCity, count(*) as cantidad, sum(freight) as soles
From orders
Group by ShipCity
/*
Así como hemos utilizado el SUM y el COUNT, podemos utilizar el AVG, MAX y MIN, te voy a mostrar como se vería.
*/
Select ShipCity, count(*) as cantidad, sum(freight) as soles,
Min(Freight), avg(Freight), max(Freight)
From orders
Group by ShipCity
-- NOTA: Un campo calculado es un campo que no se almacena físicamente en la tabla.
-- Consultas usando HAVING
/*
QUE PASA SI NOSOTROS QUISIERAMOS FILTRAR POR UN CAMPO CALCULADO, POR EJEMPLO ACA YO VEO
QUE ALGUNOS SON 37, 306 (SOLES) Y YO QUISERA SOLAMENTE FILTRAR AQUELLOS QUE TENGAN UN TOTAL MAYOR A 1000,
Freight = Transporte
CODIGO ANTERIOR
*/
Select ShipCity, count(*) as cantidad, sum(freight)as soles,
Min(Freight), avg(Freight), max(Freight)
From orders
Group by ShipCity
-- CODIGO ANTERIOR AGREGANDO WHERE
/*
ES DECIR UN sum(freigt) mayor a 1000 CON WHERE. SI LO EJECUTO NOS DA ERROR
*/
Select ShipCity, count(*) as cantidad, sum(freight) as soles
Min(Freight), avg(Freight), max(Freight)
From orders
Where sum(Freight) > 1000
Group by ShipCity
-- NOS DA UN ERROR PORQUE WHERE NO PUEDE FUNCIONAR CON CAMPOS CALCULADOS
--POR ESO PONEMOS HAVING QUE SI SIRVE PARA CAMPOS CALCULADOS, ES COMO UN WHERE PERO PARA CAMPOS CALCULADOS.
Select ShipCity, count(*) as cantidad, sum(freight)as soles,
Min(Freight), avg(Freight), max(Freight)
From orders
Group by ShipCity
Having sum(Freight)> 1000
--CONSULTAS USANDO CASE
/*
EL CASE ES UN CONDICIONAL QUE PODEMOS UTILIZAR EN LAS CONSULTAS DE SQL SERVER,
PODRIAMOS TOMAR LA TABLA DE PROVEEDORES (SUPLIERS) DE NUESTRO DIAGRAMA DE ENTIDAD RELACION.
En el caso de la region podemos ver valores nulos y otros, que pasa si yo quiero reemplazarlos
por otros valores. Vamos a convertir todos los null en blancos y los LA en Latino y lo demas lo dejaremos asi.
Suppliers = proveedores
*/
Select * from suppliers
Select CompanyName,
Case when region is null then ''
When region = 'LA' then 'LATINO'
else 'OTRO' end,
Region
From suppliers
/*
Si la region es nulo entonces pon carácter en blanco,si la region es igual a LA pondremos LATINO
sino vamos a ponerle OTRO, y FIN.
*/
/*
VAMOS A LA TABLA ORDENES
QUISIERAMOS VER CUANTO SE HA GASTADO EN ÓRDENES, COMO PODRIAMOS HACERLO
Si yo quisiera extraer el mes de la fecha, lo veremos mas adelante,
pero te lo voy adelantando que tu puedes utilizar la función month sobre el orderdate,
y de esta manera puedes obtener el mes de la fecha.
Como podríamos obtener el total de cada mes.
*/
Select * from orders
Select month(orderdate), sum(freight)
From orders
Group by month(orderdate)
Order by month(orderdate)
/*
QUE PASA SI LOS MESES QUISIERAMOS PONERLO EN LA PARTE SUPERIOR
CUANDO EL MES SEA 1 ENTONCES TOMAREMOS EL COSTO, SINO ME DEVUELVE CERO,
ES DECIR SOLO VA A MOSTRAR VALORES CUANDO SEA EL MES PRIMERO.
A ESTO LO PODEMOS ACUMULAR Y PODEMOS PONERLE ENERO.
AHORA LO COPIAMOS HASTA JUNIO PARA QUE NO SEA MUY LARGO, Y SOLAMENTE CAMBIAREMOS
LOS MESES A 2, ETC Y LOS NOMBRES.
RESULTADO.- QUE LOS MESES ENERO FEBRERO Y MARZO SON,
CUANDO TENIAMOS LA OTRA INSTRUCCIÓN NOS SALIA LOS MISMOS VALORES,
FINALEMENTE SON EQUIVALENTES, SOLO QUE LA PRIMERA ES DE MANERA VERTICAL Y GRACIAS
AL CASE PODEMOS CONVERTIMOS EN UN CALCULO HORIZONTAL.
*/
SELECT sum(case when month(orderdate)=1 then freight else 0 end) as Ener,
SUM(CASE WHEN month(OrderDate) = 2 THEN Freight ELSE 0 END) as Febr,
SUM(CASE WHEN month(OrderDate) = 3 THEN Freight ELSE 0 END) as Marz,
SUM(CASE WHEN month(OrderDate) = 4 THEN Freight ELSE 0 END) as Abri,
SUM(CASE WHEN month(OrderDate) = 5 THEN Freight ELSE 0 END) as Mayo,
SUM(CASE WHEN month(OrderDate) = 6 THEN Freight ELSE 0 END) as Juni
FROM Orders
-- Gracias al CASE podemos ponerlo en forma horizontal.