Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Laboratorio 4 - Usando Transact-SQL
Laboratorio 4 - Usando Transact-SQL
LABORATORIO No.4.1
Escriba una consulta con pivote
use [AdventureWorks2016CTP3]
SELECT SalesOrderID, CustomerID, SalesPersonID
FROM Sales.SalesOrderHeader
WHERE SalesPersonID IS NOT NULL
Esta consulta representa la base del pivote. Devuelve los datos fila por fila.
USE [AdventureWorks2016CTP3]
SELECT
SalesPersonID, [29486] AS Cust1, [29487] AS Cust2, [29488] AS Cust3, [29491] AS Cust4,
[29492] AS Cust5, [29512] AS Cust6
FROM (
) AS p
PIVOT
(
COUNT(SalesOrderID)
FOR CustomerID IN
(
[29486],[29487],[29488],[29491],[29492],[29512])
) AS pvt
ORDER BY SalesPersonID
Esta parte de la consulta especifica el operador PIVOT, lo que se agregan, y que los
clientes incluir en el conjunto de resultados.
5. La consulta final debe ser similar a la siguiente:
USE [AdventureWorks2016CTP3]
SELECT
SalesPersonID, [29486] AS Cust1, [29487] AS Cust2, [29488] AS Cust3, [29491] AS Cust4,
[29492] AS Cust5, [29512] AS Cust6
FROM (
SELECT SalesOrderID, CustomerID, SalesPersonID FROM Sales.SalesOrderHeader
WHERE SalesPersonID IS NOT NULL
) AS p
PIVOT
(
COUNT(SalesOrderID)
FOR CustomerID IN
(
[29486],[29487],[29488],[29491],[29492],[29512])
) AS pvt
ORDER BY SalesPersonID
Como puede ver, cada fila agrega para mostrar una lista distinta de los vendedores y
cuántas ventas se han hecho a cada cliente en la lista de pivote.
)
GO
INSERT INTO dbo.unPvt
(
SalesPersonID, Cust1, Cust2, Cust3, Cust4, Cust5, Cust6
)
VALUES
(274, 5, 6, 4, 2, 6, 7),
(275, 1, 7, 2, 3, 6, 8),
(276, 0, 2, 8, 9, 6, 3),
(277, 6, 3, 1, 7, 6, 1),
(278, 5, 4, 9, 0, 2, 0),
(279, 2, 1, 0, 1, 8, 9)
GO
Esto no es realmente parte de la consulta UNPIVOT, pero se trata de datos que debe ser
proporcionado con el fin de mostrar un ejemplo práctico.
SELECT SalesPersonID, Cust1, Cust2, Cust3, Cust4, Cust5, Cust6 FROM unPvt
USE [AdventureWorks2016CTP3]
GO
SELECT SalesPersonID, Customer, Sales
FROM
(
Esto representa los datos que se devuelven cuando se ejecuta la consulta final.
(
Sales FOR Customer IN
(
Cust1, Cust2, Cust3, Cust4, Cust5, Cust6
)
)AS unpvt;
GO
Esta parte de la consulta incluye el operador UNPIVOT que, en lugar de agregar los datos
como pivote, incluye una lista de los clientes que se incluirán en el conjunto de resultados
de fila por fila.
USE [AdventureWorks2016CTP3]
GO
SELECT SalesPersonID, Customer, Sales
FROM
(
SELECT SalesPersonID, Cust1, Cust2, Cust3, Cust4, Cust5, Cust6 FROM unPvt
) up
UNPIVOT
(
Sales FOR Customer IN
(
Cust1, Cust2, Cust3, Cust4, Cust5, Cust6
)
)AS unpvt;
GO
7. Ejecutar la consulta.
Como se muestra aquí, cada fila representa el número de ventas realizadas a un
cliente determinado.
USE [AdventureWorks2016CTP3];
SELECT
ProductID,
ProductNumber,
Name AS ProductName,
ListPrice
FROM Production.Product
ORDER BY ProductID
OFFSET 0 ROWS
FETCH NEXT 10 ROWS ONLY
Un adicional, y probablemente el más importante, el requisito es que con este par debe ir
precedida de una cláusula ORDER BY. La columna especificada en la cláusula ORDER BY
determina el orden y qué filas se devolverán. La siguiente consulta se modifica
ligeramente, de modo que, en lugar de comenzar en la primera fila, el desplazamiento se
cambia a 10:
USE [AdventureWorks2016CTP3];
SELECT
ProductID,
ProductNumber,
Name AS ProductName,
ListPrice
FROM Production.Product
ORDER BY ProductID
OFFSET 10 ROWS
FETCH NEXT 10 ROWS ONLY
USE [AdventureWorks2016CTP3];
DECLARE @ProductID int = 1;
Esta parte del código selecciona información del producto con una igualdad cláusula
WHERE utilizando la variable como el valor de filtro.
LABORATORIO No.4.2
Inserte una fila en una tabla mediante la instrucción INSERT INTO
USE [AdventureWorks2016CTP3];
INSERT INTO HumanResources.Department(Name, GroupName, ModifiedDate)
VALUES('Payroll', 'Executive General and Administration', '6/12/2017');
No todas las columnas de la tabla tienen que aparecer en la instrucción INSERT. Debe
especificar un valor en la cláusula VALUES para todas las columnas que se han
enumerado. En la consulta anterior, DepartmentID fue omitido de la lista de columnas.
La ejecución de la siguiente consulta se mostrará la nueva fila:
USE [AdventureWorks2016CTP3];
SELECT
DepartmentID, Name, GroupName, ModifiedDate
FROM HumanResources.Department
ORDER BY DepartmentID DESC;
USE [AdventureWorks2016CTP3];
SET IDENTITY_INSERT HumanResources.Department ON
INSERT INTO HumanResources.Department(DepartmentID, Name, GroupName, ModifiedDate)
VALUES(18, 'International Marketing', 'Sales and Marketing', '5/26/2017');
SET IDENTITY_INSERT HumanResources.Department OFF
Tanto de los enfoques antes mencionados insertar una única fila. Mediante el aprovechamiento de la
cláusula VALUES, puede insertar varias filas en una tabla con una sola sentencia.
Insertar varias filas en una tabla mediante la instrucción INSERT INTO
USE [AdventureWorks2016CTP3];
INSERT INTO HumanResources.Department
VALUES
('International Sales', 'Sales and Marketing', '5/26/2017'),
('Media Control', 'Quality Assurance', '5/26/2017')
En lugar de escribir una sola sentencia INSERT para cada fila, puede proporcionar una lista
separada por comas de los valores para cada fila en la cláusula VALUES. La siguiente figura
ilustra el resultado de la inserción de varias filas.
Además de utilizar la cláusula VALUES para insertar varias filas, puede insertar varias filas de una
tabla existente en otra tabla utilizando una sentencia SELECT.
USE [AdventureWorks2016CTP3];
USE [AdventureWorks2016CTP3];
SELECT
DepartmentID, Name, GroupName, ModifiedDate
INTO dbo.Department
FROM HumanResources.Department
La nueva tabla puede tener características similares a las del esquema de la tabla que
actúa como fuente. Sin embargo, la columna longitudes, tanto de cadena y numérico
puede cambiar, y las claves, índices y restricciones no se creará en la nueva tabla. Por lo
tanto, se debe evitar el uso de SELECT INTO una tabla permanente.
USE [AdventureWorks2016CTP3];
UPDATE HumanResources.Department
SET Name = Name +' Europe'
WHERE DepartmentID = 19
Esta instrucción UPDATE utiliza una expresión para añadir Europa a la columna Nombre
para una sola fila en la tabla de Departamento.
Como medida de precaución, se debe añadir un filtro adicional a la cláusula WHERE para
asegurar que la instrucción UPDATE no es repetible. En otras palabras, si se ejecutó la
consulta accidentalmente dos veces, no tendría ningún efecto sobre los datos. Esto es
especialmente importante cuando se realiza una concatenación o un cambio matemático.
La consulta siguiente muestra cómo lograr esto:
USE [AdventureWorks2016CTP3];
UPDATE HumanResources.Department
SET Name = Name +' Europe'
WHERE DepartmentID = 19
AND NAME NOT LIKE '% Europe'
El nuevo filtro que utiliza LIKE asegura que, si vuelve a ejecutar la consulta, no tendrá
ningún efecto sobre los datos que hubiera actualizado previamente.
USE [AdventureWorks2016CTP3];
UPDATE Production.Product
USE [AdventureWorks2016CTP3];
DELETE FROM HumanResources.Department
WHERE DepartmentID = 22
USE [AdventureWorks2016CTP3];
DELETE FROM HumanResources.Department
FROM HumanResources.Department d
LEFT OUTER JOIN HumanResources.EmployeeDepartmentHistory ed
ON d.DepartmentID = ed.DepartmentID
WHERE ed.DepartmentID IS NULL
están asociados con ninguna fila en la tabla referenciada. Acoplamiento que LEFT OUTER
JOIN de referencia con la cláusula WHERE asegura que sólo se eliminan las filas objetivo.
USE [AdventureWorks2016CTP3];
TRUNCATE TABLE dbo.Department
Recuerde que la sentencia TRUNCATE elimina todas las filas de la tabla de referencia.
Antes de ejecutar esta sentencia, debe asegurarse de que esto es exactamente lo que
piensa hacer. Una vez que se ejecuta la sentencia, se eliminarán todos los datos.
proporcionará los datos a la tabla de destino. Similar a JOIN, la palabra clave ON se utiliza
para realizar la relación entre las dos tablas. En otras palabras, si hay una coincidencia
entre los dos valores de cada tabla (cuando coinciden), a continuación, actualizar las filas.
Si no hay una relación (Si la alineación no), a continuación, insertar las filas.
USE [AdventureWorks2016CTP3];
INSERT INTO HumanResources.Department
OUTPUT inserted.DepartmentID, inserted.Name, inserted.GroupName, inserted.
ModifiedDate
VALUES('International Marketing', 'Sales and Marketing', '5/26/2017');
La instrucción de salida simplemente devuelve las filas afectadas por la entrada para el
cliente. Para dar salida a los datos de una inserción, que hacen referencia a un nombre de
tabla lógica insertada. Esta tabla existe dentro del ámbito de la consulta, y los datos sólo
se pueden acceder a continuación.
USE [AdventureWorks2016CTP3];
UPDATE HumanResources.Department
SET Name = Name +' Europe'
OUTPUT
deleted.Name AS OldName,
inserted.Name AS UpdateValue
WHERE DepartmentID = 25
Con la salida de datos de una actualización, usted tendrá acceso no sólo a la tabla inserted
lógica, sino también a una tabla deleted. La tabla deleted contiene los valores anteriores a
la actualización y la tabla inserted contiene los valores después de la actualización.
USE AdventureWorks2017;
GO
CREATE TABLE dbo.Department_Audit
(
DepartmentID int NOT NULL,
Name nvarchar(50) NOT NULL,
GroupName nvarchar(50) NOT NULL,
DeletedDate datetime NOT NULL
CONSTRAINT DF_Department_Audit_DeletedDate_Today DEFAULT(GETDATE()))
USE [AdventureWorks2016CTP3];
DELETE FROM dbo.Department
OUTPUT deleted.Departmentid, deleted.Name, deleted.GroupName
INTO dbo.Department_Audit(DepartmentID, Name, GroupName)
WHERE DepartmentID = 16
USE [AdventureWorks2016CTP3];
SELECT *
FROM dbo.Department_Audit
Verá exactamente los datos que la tabla Departamento contenía antes de la eliminación.
LABORATORIO No.4.3
Retornando valores de fecha y hora
3. El conjunto de resultados será un solo valor de fecha y hora igual a la fecha y hora que
ejecutó la consulta.
SELECT
DAY(GETDATE()) AS DAY,
MONTH(GETDATE()) AS MONTH,
YEAR(GETDATE()) AS YEAR,
SELECT
DATEFROMPARTS ( 1972, 5, 26) AS DATEFROMPARTS,
DATETIME2FROMPARTS ( 1972, 5, 26, 7, 14, 16, 10, 3 ) AS DATETIME2FROMPARTS,
DATETIMEFROMPARTS ( 1972, 5, 26, 7, 14, 16, 10) AS DATETIMEFROMPARTS,
DATETIMEOFFSETFROMPARTS ( 1972, 5, 26, 7, 14, 16, 10, 12, 0, 3 ) AS DATETIMEOFFSETFROMPARTS,
SMALLDATETIMEFROMPARTS ( 1972, 5, 26, 7, 14) SMALLDATETIMEFROMPARTS,
TIMEFROMPARTS(7, 14, 16, 10, 3) TIMEFROMPARTS
Ahora se puede producir valores de variables de fecha y hora de los diferentes niveles de
precisión mediante el uso de funciones incorporadas en lugar de escribir código
personalizado T-SQL.
SELECT
DATEDIFF(dd, GETDATE(), '5/26/2013') AS DaysUntilMyBirthday,
DATEADD(y, 1, GETDATE()) AS DateAdd,
EOMONTH(GETDATE()) AS EOMonth, --Nuevo to SQL Server 2017
ISDATE(GETDATE()) AS IsValidDate,
ISDATE('13/1/2122') AS InvalidDate
USE [AdventureWorks2016CTP3];
SELECT TOP(10)
SalesOrderNumber,
TotalDue,
CAST(TotalDue AS decimal(10,2)) AS TotalDueCast,
OrderDate,
CAST(OrderDate AS DATE) AS OrderDateCast
FROM Sales.SalesOrderHeader;
SELECT
CONVERT(VARCHAR(20), GETDATE()) AS [Default],
CONVERT(VARCHAR(20), GETDATE(), 100) AS DefaultWithStyle,
CONVERT(VARCHAR(10), GETDATE(), 103) AS BritishFrenchStyle,
CONVERT(VARCHAR(8), GETDATE(), 105) AS ItalianStyle,
CONVERT(VARCHAR(8), GETDATE(), 112) AS ISOStyle,
CONVERT(VARCHAR(15), CAST('111111.22' AS MONEY), 1) AS MoneyWithCommas
Lo que usted debe notar inmediatamente es que la función CONVERT acepta tres
argumentos. El primer argumento es el tipo de datos de destino o el tipo de fecha que
desea convertir un valor dado a. El segundo argumento es el valor real que se convertirá, y
Las primeras cinco columnas representan las conversiones de fecha a los diferentes estilos
de los países. La última columna muestra el uso de la función CONVERT para agregar
puntos a un valor que es del tipo de datos money. En la consulta, la función CAST se utiliza
en la última línea de código para convertir la cadena en el dinero, y luego la función
CONVERT se utiliza para convertir ese valor a volver a una cadena con comas.
SELECT
TRY_CAST('PATRICK' AS INT) TryCast,
TRY_CONVERT(DATETIME, '13/2/2999', 112) AS TryConvert,
PARSE('Saturday, 26 May 2017' AS DATETIME USING 'en-US') AS Parse,
TRY_PARSE('Patricks BirthDay' AS DATETIME USING 'en-US') AS TryParse