Ejercicios resueltos con SQL Server y AdventureWorks

En este post vamos a resolver algunas consultas propuestas en el motor de bases de datos de SQL Server y la base de datos AdventureWorks.

Si no tienes SQL Server mira aquí cómo instalarlo, y si no sabes importar la base de datos, mira aquí cómo hacerlo.

¿Quieres ejercicios resueltos con MySQL? mira este post.

Consultas resueltas en SQL Server

Nota: si crees que puedes mejorar una consulta, deja la solución en los comentarios 😉

1 – Empleados y departamento

Mostrar a todos los empleados que se encuentran en el departamento de manufactura y de aseguramiento de la calidad.

Para hacer esta consulta hay que unir la tabla de empleados con la del historial de departamentos, pues queremos saber el puesto actual del empleado. Además, hay que unirla con la tabla de departamentos en donde el departamento sea QA o Production.

Solución en código:

select e.BusinessEntityID, e.*,
d.Name
from HumanResources.Employee e 
inner join 
HumanResources.EmployeeDepartmentHistory h
on e.BusinessEntityID = h.BusinessEntityID
inner join HumanResources.Department d
on d.DepartmentID = h.DepartmentID
and h.EndDate is null
and d.Name in ('Quality Assurance', 'Production');

2 – Empleados

Indicar el listado de los empleados del sexo masculino y que son solteros

Esta es un poco más fácil. El género masculino se toma de la columna Gender donde sea M y para saber si son solteros se usa el MaritalStatus en Single o S.

/*
Indicar el listado de los empleados del sexo masculino y que son solteros
*/
select * from HumanResources.Employee where Gender  = 'M' and MaritalStatus = 'S';

3 – Empleados y apellidos

Empleados cuyo apellido sea con la letra “S”

Aquí usamos a LIKE con comodines y consultamos la tabla de empleados uniéndola con la tabla de personas.

/* Empleados cuyo apellido sea con la letra "S"*/

select * from HumanResources.Employee e 
inner join Person.Person p 
on e.BusinessEntityID = p.BusinessEntityID
and p.LastName like '%S%';

4 – Empleados y estados

Los empleados que son del estado de Florida

Para eso hacemos múltiples uniones, sobre todo por eso de la dirección de cada persona. Queda así:

/*Los empleados que son del estado de Florida*/
select pp.*,ps.Name from HumanResources.Employee he
inner join Person.Person pp
on pp.BusinessEntityID = he.BusinessEntityID
inner join Person.BusinessEntityAddress pb
on pb.BusinessEntityID = pp.BusinessEntityID
inner join Person.Address pa
on pa.AddressID = pb.AddressID
inner join Person.StateProvince ps
on ps.StateProvinceID = pa.StateProvinceID
and ps.Name = 'Florida';

5 – Suma de ventas

Ahora la consulta dice:

La suma de las ventas hechas por cada empleado, y agrupadas por año

Tenemos que agrupar y usar la función year que devuelve el año a partir de una fecha. La consulta completa queda así:

/*La suma de las ventas hechas por cada empleado, y agrupadas por año*/
select pp.FirstName, sum(SalesQuota) as total_vendido,
year(QuotaDate) as año
from Sales.SalesPersonQuotaHistory qh
inner join Person.Person pp
on qh.BusinessEntityID = pp.BusinessEntityID
group by pp.BusinessEntityID, year(QuotaDate), pp.FirstName
order by pp.BusinessEntityID;

6 – El producto más vendido

Simplemente consultamos las veces que se ha vendido y lo ordenamos, seleccionando el primer elemento.

La consulta queda así:

/*El producto más vendido*/
select top 1 pp.ProductID, pp.Name, count(ss.ProductID) as veces_vendido
from Production.Product pp
inner join Sales.SalesOrderDetail ss
on pp.ProductID = ss.ProductID
group by ss.ProductID, pp.Name, pp.ProductID
order by count(ss.ProductID) desc;

7 – El producto menos vendido

Lo mismo que antes, pero ahora ordenando por el número de veces que se vendió, de manera ascendente.

/*El producto menos vendido*/
select top 1 pp.ProductID, pp.Name, count(ss.ProductID) as veces_vendido
from Production.Product pp
inner join Sales.SalesOrderDetail ss
on pp.ProductID = ss.ProductID
group by ss.ProductID, pp.Name, pp.ProductID
order by count(ss.ProductID) asc;

8 – Ventas

La consulta dice:

Listado de productos por número de ventas ordenando de mayor a menor

Hay que unir los detalles de las ventas con la tabla de productos. La solución es la siguiente:

/*Listado de productos por no de ventas ordenando de mayor a menor*/
select pp.ProductID, pp.Name,pp.ProductNumber, pp.ListPrice,
count(ss.ProductID) as veces_vendido
from Production.Product pp
inner join Sales.SalesOrderDetail ss
on pp.ProductID = ss.ProductID
group by ss.ProductID, pp.Name, pp.ProductID,pp.ProductNumber, pp.ListPrice
order by count(ss.ProductID) desc;

9 – Las ventas por territorio

Se deben unir los encabezados de las ventas, los detalles de las ventas, los territorios de ventas y los territorios.

La solución es la siguiente:

/*Las ventas por territorio*/
select st.Name, sum(so.OrderQty * so.UnitPrice) as total_vendido
from Sales.SalesOrderHeader sh
inner join Sales.SalesOrderDetail so
on sh.SalesOrderID = so.SalesOrderID
inner join Sales.SalesTerritory st
on st.TerritoryID = sh.TerritoryID
group by st.TerritoryID, st.Name
order by sum(so.OrderQty * so.UnitPrice) desc;

Poniendo todo junto

Todas las consultas quedan de la siguiente manera:

/*
    Ejercicios resueltos de consultas en SQL Server
    y base de datos Adventure Works

    Más ejercicios y tutoriales en:
        parzibyte.me/blog
*/
/*
 Mostrar a todos los empleados que se encuentran en el departamento de manufactura y de aseguramiento de la calidad
*/
select e.BusinessEntityID, e.*,
d.Name
from HumanResources.Employee e 
inner join 
HumanResources.EmployeeDepartmentHistory h
on e.BusinessEntityID = h.BusinessEntityID
inner join HumanResources.Department d
on d.DepartmentID = h.DepartmentID
and h.EndDate is null
and d.Name in ('Quality Assurance', 'Production');

/*
Indicar el listado de los empleados del sexo masculino y que son solteros
*/
select * from HumanResources.Employee where Gender  = 'M' and MaritalStatus = 'S';



/* Empleados cuyo apellido sea con la letra "S"*/

select * from HumanResources.Employee e 
inner join Person.Person p 
on e.BusinessEntityID = p.BusinessEntityID
and p.LastName like '%S%';


/*Los empleados que son del estado de Florida*/
select pp.*,ps.Name from HumanResources.Employee he
inner join Person.Person pp
on pp.BusinessEntityID = he.BusinessEntityID
inner join Person.BusinessEntityAddress pb
on pb.BusinessEntityID = pp.BusinessEntityID
inner join Person.Address pa
on pa.AddressID = pb.AddressID
inner join Person.StateProvince ps
on ps.StateProvinceID = pa.StateProvinceID
and ps.Name = 'Florida';



/*La suma de las ventas hechas por cada empleado, y agrupadas por año*/
select pp.FirstName, sum(SalesQuota) as total_vendido,
year(QuotaDate) as año
from Sales.SalesPersonQuotaHistory qh
inner join Person.Person pp
on qh.BusinessEntityID = pp.BusinessEntityID
group by pp.BusinessEntityID, year(QuotaDate), pp.FirstName
order by pp.BusinessEntityID;

select qh.BusinessEntityID, pp.FirstName, pp.LastName, 
sum(qh.SalesQuota) as Ventas_Totales
from Sales.SalesPersonQuotaHistory qh
inner join Person.Person pp
on qh.BusinessEntityID = pp.BusinessEntityID
group by qh.BusinessEntityID, pp.FirstName, LastName
Order by Ventas_Totales desc

/*El producto más vendido*/
select top 1 pp.ProductID, pp.Name, count(ss.ProductID) as veces_vendido
from Production.Product pp
inner join Sales.SalesOrderDetail ss
on pp.ProductID = ss.ProductID
group by ss.ProductID, pp.Name, pp.ProductID
order by count(ss.ProductID) desc;


/*El producto menos vendido*/
select top 1 pp.ProductID, pp.Name, count(ss.ProductID) as veces_vendido
from Production.Product pp
inner join Sales.SalesOrderDetail ss
on pp.ProductID = ss.ProductID
group by ss.ProductID, pp.Name, pp.ProductID
order by count(ss.ProductID) asc;

/*Listado de productos por no de ventas ordenando de mayor a menor*/
select pp.ProductID, pp.Name,pp.ProductNumber, pp.ListPrice,
count(ss.ProductID) as veces_vendido
from Production.Product pp
inner join Sales.SalesOrderDetail ss
on pp.ProductID = ss.ProductID
group by ss.ProductID, pp.Name, pp.ProductID,pp.ProductNumber, pp.ListPrice
order by count(ss.ProductID) desc;

/*Las ventas por territorio*/
select st.Name, sum(so.OrderQty * so.UnitPrice) as total_vendido
from Sales.SalesOrderHeader sh
inner join Sales.SalesOrderDetail so
on sh.SalesOrderID = so.SalesOrderID
inner join Sales.SalesTerritory st
on st.TerritoryID = sh.TerritoryID
group by st.TerritoryID, st.Name
order by sum(so.OrderQty * so.UnitPrice) desc;

Estoy aquí para ayudarte 🤝💻


Estoy aquí para ayudarte en todo lo que necesites. Si requieres alguna modificación en lo presentado en este post, deseas asistencia con tu tarea, proyecto o precisas desarrollar un software a medida, no dudes en contactarme. Estoy comprometido a brindarte el apoyo necesario para que logres tus objetivos. Mi correo es parzibyte(arroba)gmail.com, estoy como@parzibyte en Telegram o en mi página de contacto

No te pierdas ninguno de mis posts 🚀🔔

Suscríbete a mi canal de Telegram para recibir una notificación cuando escriba un nuevo tutorial de programación.

9 comentarios en “Ejercicios resueltos con SQL Server y AdventureWorks”

  1. Hola parzibyte tengo este problema, agredeceria tu ayuda:
    Seleccionar la lista de empleados (BusinessEntityID, FirstName, LastName, JobTitle, VacationHours) y su Edad (BirthDate) en años de las tablas Person y Employees, de los esquemas Person y HumanResources; que tengan más horas de vacaciones (VacationHours) que las del promedio, y ordenar las edades de forma descendente.
    Saludos…

  2. hola Genial tu aporte es lo que busco para practicar mucho, quisiera hacerte una consulta que talvez sea obvia o tal vez no, pues no lo sé, donde puedo descargar la base de datos con la que trabajaste ???
    Existeee??? o es para tomar de ejemplo y aplicar en otras bd desde ya gracias por todo !
    saludos!

  3. Primero que todo muchas gracias por compartir el conocimiento @parzibyte, felicitaciones por eso. Mas que un comentario es una apreciación a la consulta del producto mas vendido, creo que la consulta debe estar compuesta por OrderQty debido a que representa la cantidad de productos solicitados en las ordenes y no el conteo del id de producto:

    /*El producto más vendido*/
    select top 1 pp.ProductID, pp.Name, sum(ss.OrderQty) as veces_vendido
    from Production.Product pp
    inner join Sales.SalesOrderDetail ss
    on pp.ProductID = ss.ProductID
    group by ss.ProductID, pp.Name, pp.ProductID
    order by sum(ss.ss.OrderQty) desc;

  4. Kevin Alexander Gaibor Fernandez

    El metodo de envio mas usado

    ayudame con este ejercicio con la misma base de datos los otros que ayudaron demasiado gracias hermano

Dejar un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *