Subconsultas en SQL Server – casos prácticos

Subconsultas – ejercicios

Las subconsultas permiten extraer información que incluyen varias tablas, estas generalmente reportan un solo dato a un conjunto de resultados con una columna. Para la parte teórica completa y las condiciones y restricciones ver Subconsultas.

En este artículo veremos como desarrollar ejemplos analizando los datos y armando por pasos la subconsulta

Ejercicios

Usando Northwind

use northwind
go

Algo de teoría de Subconsultas

Pueden utilizarse de dos formas:

1. Dentro de la Lista de campos de la instrucción Select

select ListaCampos, (Select Campo from TablaSubconsulta where…)  from TablaPrincipal

2. En la clásula Where

Select ListadeCampos, OtroCampo, UltimoCampo from Tabla
Where Campo =( Select… )

1. — Listado de Clientes (Customers) que compraron en Agosto de 1997

select * from Customers
where CustomerID in
(select distinct CustomerID from Orders where Datename(mm,OrderDate) = ‘Agosto’ 
and year(OrderDate) = 1997)
go

Note la subconsulta en negrita.

2. — Listado con las cantidades vendidas de los productos descontinuados. Incluir solamente los que tienen Stock

Primero: los productos descontinuados
select * from Products where Discontinued = 1
go

¿Dónde están las unidades vendidas?
select * from [Order Details]
go

Armando la solución

select P.ProductID, P.ProductName, p.UnitPrice from Products As P
where P.Discontinued = 1 and P.UnitsInStock > 0
go
Códigos de los descontinuados que tiene Stock
select P.ProductID from Products  As P where P.Discontinued = 1 and P.UnitsInStock > 0
go

Cantidades vendidas de cada producto
select Sum(Od.Quantity), OD.ProductID from [Order Details] As OD
where OD.ProductID in (select P.ProductID from Products
As P where P.Discontinued = 1 and P.UnitsInStock > 0)
Group by OD.ProductID
go

SOLUCION
select P.ProductID, P.ProductName, p.UnitPrice,
(select Sum(Od.Quantity) from [Order Details] As OD  where OD.ProductID in (select P.ProductID from Products As P where P.Discontinued = 1 and P.UnitsInStock > 0)
AND od.ProductID = p.ProductID) As ‘Cantidad Vendidas’
from Products As P  where P.Discontinued = 1 and P.UnitsInStock > 0
go

3. — Empleados y la cantidad de órdenes generadas y NO atendidas

Empleados
select E.EmployeeID, Empleado = E.LastName + Space(1) + E.FirstName
from Employees As E

Conteo de las Ordenes NO ATENDIDAS
select COUNT(O.OrderID) As ‘Órdenes no Atendidas’  from Orders As O where ShippedDate is null
go

SOLUCION
select E.EmployeeID, Empleado = E.LastName + Space(1) + E.FirstName,
( — INICIO DE LA SUBCONSULTA
select COUNT(O.OrderID) from Orders As O where ShippedDate is null
AND O.EmployeeID = E.EmployeeID
) As ‘Órdenes no Atendidas’– FINAL DE LA SUBCONSULTA
from Employees As E
where (select COUNT(O.OrderID) from Orders As O where ShippedDate is null
AND O.EmployeeID = E.EmployeeID) > 0
order by ‘Órdenes no Atendidas’ desc
go