Where filtrado de registros SQL Server

Filtrando registros con Where

El filtro de registros al hacer consultas permite seleccionar los datos que se requieren usando comparaciones de dos datos del mismo tipo y crear una expresión lógica con las condiciones que deben de cumplir los registros a seleccionar.

En una consulta usando Select es necesario casi siempre ser lo más explícito al extraer los datos de los registros, tanto en los campos necesarios en la consulta como en los registros a mostrar, no se recomienda mostrar, salvo que sea exactamente necesario, todos los campos o todos los registros, siempre filtre y para este filtro se debe usar la cláusua Where de Select.

Para mayor información ver:

Consultas de SQL Server
Operadores en SQL Server
Filtros con Having
Agrupamientos en SQL Server
Índices en SQL Server
Joins, consultando varias tablas
Funciones de fecha y hora
Subconsultas en SQL Server

Importante

  • Al hacer agrupamientos, si se va a filtrar por el campo agrupado se usa la cláusula Having.
  • Se puede usar la expresión lógica de la cláusula Where en la cláusula Having cuando en la instrucción se usen ambas.
  • No se puede usar la cláusula Having solamente con la expresión lógica de la cláusula Where.
  • Se recomienda no usar muchos filtros en una consulta, además de crear índices para los campos por los cuales se filtra.
  • Se sugiere incluir los filtros para campos calculados en la cláusula Having y para los campos sin agrupamiento en la cláusula Where

Usando la base de datos Northwind

use Northwind
go

Ejercicio 1

Mostrar los clientes de las ciudades de Berlin, Caracas, London y Sevilla. No se recomienda usar el símbolo * (asterisco) para mostrar todos los campos, se ha utilizado para enfocar el ejercicio en el filtro.
select * from Customers
where City = ‘Berlin’ or City = ‘Caracas’ or City =’London’ or City=’Sevilla’
go
Se puede usar el operador In
select * from Customers
where City in (‘Berlin’,’Caracas’,’London’,’Sevilla’)
go
El resultado se muestra en la siguiente imagen

Ejercicio 2

Filtrar los clientes cuyo ultimo dígito del número de teléfono es par, incluir los que terminan en CERO. Mostrar el nombre del cliente y el número de teléfono
select CompanyName As ‘Cliente’, Phone As ‘Teléfono’
from Customers
where (Right(Rtrim(Phone),1)%2)= 0 and Right(Rtrim(Phone),1)<> 0
go
El resultado se muestra en la siguiente imagen

Ejercicio 3

Filtar las órdenes generadas en los últimos 15 días.
Como en Northwind las órdenes registradas están entre julio de 1996 y mayo de 1998, se va a tomar el 16 de noviembre de 1996 como fecha referencial para mostar las órdenes de los 15 días anteriores.
Para mostrar las órdenes de los últimos 15 días reemplace la fecha tomada como referencia por la fecha actual: Getdate()

Set dateformat dmy
go
select O.OrderID As ‘Nº Orden’,
Format(O.OrderDate, ‘dd/MM/yyyy’) As ‘Fecha’
from Orders As O
where O.OrderDate >= DateAdd(d,-15,’16/11/1996′) and O.OrderDate < ’16/11/1996′
go
El resultado se muestra en la siguiente imagen

Importante: la expresión lógica del filtro con la fecha actual sería como sigue, usando Northwind no aparecen registros.
select O.OrderID As ‘Nº Orden’,
Format(O.OrderDate, ‘dd/MM/yyyy’) As ‘Fecha’
from Orders As O
where O.OrderDate >= DateAdd(d,-15,GetDate())
go

Ejercicio 4

Filtrar los clientes cuyo nombre termine en la letra «s»
select C.CompanyName As ‘Cliente’
from Customers As C
where Lower(Rtrim(RIGHT(C.CompanyName,1))) = ‘s’
go
El resultado se muestra en la siguiente imagen

Ejercicio 5

Listar los empleados cuyas edades están entre 50 y 80 años
select
E.EmployeeID As ‘Código’, E.LastName As ‘Apellido’,
E.FirstName As ‘Nombre’ ,
Años = Floor(Cast(DATEDIFF(dd,E.BirthDate, GetDate())/365.25 As Numeric(9,2)))
from Employees As E
where Floor(Cast(DATEDIFF(dd,E.BirthDate, GetDate())/365.25 As Numeric(9,2))) between 50 and 80
go
El resultado se muestra en la siguiente imagen

Ejercicio 6

Listar los productos que tienen unidades por atender mayores al Stock actual
select
P.ProductID As ‘Código’,
P.ProductName As ‘Descripción’,
P.UnitPrice As ‘Precio’,
P.UnitsInStock As ‘Stock’,
P.UnitsOnOrder As ‘Por atender’,
P.UnitsOnOrder – P.UnitsInStock As ‘Faltantes’
from Products As P
where P.UnitsOnOrder > P.UnitsInStock
go
El resultado se muestra en la siguiente imagen

Ejercicio 7

Listar los clientes cuyo contacto trabaje en ventas (contiene la palabra Sales en el campo ContactTitle)
Select
C.CompanyName As ‘Cliente’,
C.ContactName As ‘Contacto’,
C.ContactTitle As ‘Cargo’
from Customers As C
where C.ContactTitle like ‘%Sales%’
go
El resultado se muestra en la siguiente imagen

Ejercicio 8

Listar los productos que no estén descontinuados, de las categorias 2,3,4 y 7 con un precio entre 10 y 50.
select
P.ProductID As ‘Código’,
P.ProductName As ‘Descripción’,
P.UnitPrice As ‘Precio’,
P.CategoryID As ‘Cód. Categoría’
from Products As P
where P.Discontinued = 0
and P.CategoryID in (2,3,4,7)
and P.UnitPrice between 10 and 50
go
El resultado se muestra en la siguiente imagen

Where en Subconsultas

Ejercicio 9

Mostrar los productos vendidos entre Junio y Agosto de 1997, incluir la cantidad vendida y el monto total
Select distinct D.ProductID ,
(select P.ProductName from Products As P where P.ProductID = D.ProductID) As ‘Descripción’,
(select sum(OD.Quantity)
from [Order Details] As Od
join Orders As O on OD.ORderID = O.OrderId
where Month(O.OrderDate) between 6 and 8 and Year(O.OrderDate) = 1997
and OD.ProductID = P.ProductID ) As ‘Cantidad de Productos’,
(select sum(OD.Quantity * OD.UnitPrice) from [Order Details] As Od
join Orders As O on OD.ORderID = O.OrderId
where Month(O.OrderDate) between 6 and 8 and Year(O.OrderDate) = 1997
and OD.ProductID = P.ProductID ) As ‘Monto Total’
from [Order Details] As D
join Products As P on D.ProductID = P.ProductID
where D.OrderID in
(select O.OrderID from Orders as O where Month(O.OrderDate) between 6 and 8 and
Year(O.OrderDate) = 1997)
order by D.ProductID
go

El resultado se muestra en la siguiente imagen

Ejercicio 10

Listar las órdenes de los clientes de USA, Canada, Spain y UK. Incluir el nombre del empleado y el nombre del cliente.
Note que en este ejercicio se han usado Sunconsultas para el nombre del empleado, el nombre del cliente y el nombre del pais.

select O.OrderId, Format(O.OrderDate , ‘dd/MM/yyyy’) As ‘Fecha’,
(select Empleado = E.LastName + Space(1) + E.Firstname from Employees As E
where E.EmployeeID = O.EmployeeID) As ‘Empleado’,
(Select C.Companyname from customers As C
where C.CustomerId = O.CustomerId ) As ‘Cliente’,
(Select C.Country from customers As C
where C.CustomerId = O.CustomerId ) As ‘País’
from Orders As O
where CustomerID in
(select C.CustomerID from customers As C where Country in (‘USA’, ‘Canada’, ‘Spain’,’UK’))
order by País asc, Cliente asc, Empleado asc
go

El resultado se muestra en la siguiente imagen

Ejercicio 11

Listar las órdenes que no han sido antendidas (Campos ShippedDate es Null) de los clientes que tienen asignada una Región (campo Region no es Null) de los países de Canada, Brazil, Venezuela y USA. Incluir el nombre del Empleado que la generó así como el nombre del cliente.
select
O.OrderID As ‘Nº Orden’,
Format(O.OrderDate, ‘dd/MM/yyyy’) As ‘Fecha’,
Empleado = CONCAT_WS(Space(1),E.FirstName, E.LastName),
C.CompanyName As ‘Cliente’
from Orders As O
join Employees As E on O.EmployeeID = E.EmployeeID
join Customers As C on O.CustomerID = C.CustomerId
Where O.ShippedDate is Null
and O.CustomerID in
(select C.CustomerID from Customers As C
where C.Region is not null
and C.Country in (‘Canada’, ‘Brazil’, ‘Venezuela’ , ‘USA’))
go

El resultado se muestra en la siguiente imagen