Upload
jeff-jacob
View
267
Download
1
Embed Size (px)
DESCRIPTION
T SQL samples
Citation preview
Transact-SQL ProjectSQL Server 2008 Management Studio
SetFocus Business Intelligence Master’s Program
Jeff Jacob, MBAP: (312) 772-6142
Query 1 – Wildcard Search(CI Collation)
A summary of order detail-line total by product – for products that contain ‘Washer’ in their name; 2003 data only.
USE [AdventureWorks2008];
GO
SELECT Name, SUM(LineTotal) AS TotDollars
FROM Purchasing.PurchaseOrderDetail pod
INNER JOIN Purchasing.PurchaseOrderHeader poh
ON poh.PurchaseOrderID = pod.PurchaseOrderID
INNER JOIN Production.Product prd
ON prd.ProductID = pod.ProductID
WHERE Name LIKE '%washer%‘
AND YEAR(OrderDate) = 2003
GROUP BY Name
ORDER BY TotDollars DESC
2
Query 2 – HAVING clause
A count of orders by product subcategory–for those with at least 10 orders; 2004 data only.
USE [AdventureWorks2008];
GO
SELECT psc.Name, COUNT(poh.PurchaseOrderID) AS NumOrders
FROM Purchasing.PurchaseOrderHeader poh
INNER JOIN Purchasing.PurchaseOrderDetail pod ON pod.PurchaseOrderID =
poh.PurchaseOrderID
INNER JOIN Production.Product prd ON prd.ProductID = pod.ProductID
INNER JOIN Production.ProductSubcategory psc ON prd.ProductSubcategoryID =
psc.ProductSubcategoryID
WHERE YEAR(OrderDate) = 2004
GROUP BY psc.Name
HAVING COUNT(poh.PurchaseOrderID) >=10
ORDER BY NumOrders DESC
3
Query 3 – Correlated Subquery of exclusion
A list of the vendors for which there were no orders in 2003.
USE [AdventureWorks2008];
GO
SELECT Name
FROM Purchasing.Vendor
WHERE NOT EXISTS
(SELECT * FROM Purchasing.PurchaseOrderHeader
WHERE YEAR(OrderDate) = 2003
AND Vendor.BusinessEntityID =
PurchaseOrderHeader.VendorID)
4
Query 4 – OUTER JOIN syntax
A summary of freight charges by shipper for all shippers; Q1 of 2003 data only.
USE [AdventureWorks2008];
GO
SELECT Name, SUM(Freight) AS TotFreight
FROM Purchasing.ShipMethod sm
LEFT OUTER JOIN Purchasing.PurchaseOrderHeader poh
ON poh.ShipMethodID = sm.ShipMethodID
AND YEAR(OrderDate) = 2003
AND DATEPART(q,OrderDate) = 1
GROUP BY Name
ORDER BY TotFreight DESC
5
Query 5 – Chronological Sort
USE [AdventureWorks2008];
GO
SELECT NationalIDNumber, LoginID, DATENAME(MONTH, OrderDate) AS
MonthName, YEAR(OrderDate) as YearName, SUM(TotalDue) AS
SumTotalDue
FROM Purchasing.PurchaseOrderHeader poh
INNER JOIN HumanResources.Employee emp ON emp.BusinessEntityID
= poh.EmployeeID
WHERE NationalIDNumber IN (792847334, 407505660, 482810518,
466142721, 367453993)
AND YEAR(OrderDate) = 2003
GROUP BY NationalIDNumber, LoginID, DATENAME(MONTH,
OrderDate),DATEPART(MONTH, OrderDate) ,YEAR(OrderDate)
ORDER BY NationalIDNumber, DATEPART(MONTH, OrderDate)
A summary of total charges due by specific employee national ID numbers, sorted chronologically within each employee; 2003 data only.
6
Query 6 – UNION query
A union of two view-based queries to obtain contact information of both vendors and employees, sorted first by postal code and then by name.
USE [AdventureWorks2008];
GO
SELECT 'Vendor' AS RecordType, Name, AddressLine1, ISNULL(AddressLine2,'') AS AddressLine2, City,
StateProvinceName, PostalCode
FROM Purchasing.vVendorWithAddresses
UNION ALL
SELECT 'Employee' AS RecordType, LastName + ', ‘ + FirstName + ' ‘ + ISNULL(MiddleName, ''), AddressLine1, ISNULL (AddressLine2,''), City, StateProvinceName, PostalCode
FROM HumanResources.vEmployee
ORDER BY PostalCode, Name
7
Query 7 – Stored Procedure
A stored procedure designed to summarize freight, tax amount and subtotal by vendor and shipperbased on supplied account number and dateparameters; with example usage.
USE [AdventureWorks2008];
GO
CREATE PROCEDURE dbo.usp_GetVendorOrders
@AcctNo nvarchar(15), @StartDate datetime, @EndDate datetime
AS
SET NOCOUNT ON;
SELECT Ven.Name AS VendorName, Ship.Name AS ShipperName, SUM(Freight) as TotFreight, SUM(TaxAmt) AS TotTaxAmt, SUM(SubTotal) AS TotSubTot
FROM Purchasing.PurchaseOrderHeader poh
JOIN Purchasing.Vendor Ven ON poh.VendorID = Ven.BusinessEntityID
JOIN Purchasing.ShipMethod ship ON ship.ShipMethodID = poh.ShipMethodID
WHERE OrderDate >= @StartDate and OrderDate <= @EndDate
AND AccountNumber = @AcctNo
GROUP BY Ven.Name, Ship.Name
GO
EXEC dbo.usp_GetVendorOrders N'ADVANCED0001', '1-1-2003', '12-31-2003'
8
Query 8 – PIVOT table
A pivot table of shipper data for total charges due in 2003 summarized by Saturdays with a summary rank of the Top 5 based on grand total.
;WITH ShipperTotDueCTE AS (
SELECT sm.Name, dbo.SatDatesConverter(OrderDate) AS WeekEnding, TotalDue
FROM Purchasing.PurchaseOrderHeader poh
INNER JOIN Purchasing.ShipMethod sm ON sm.ShipMethodID = poh.ShipMethodID
WHERE YEAR(OrderDate) = 2003 ),
SumByWeekEndCTE AS (
SELECT Name AS Shipper, WeekEnding, SUM(TotalDue) AS GrandTot
FROM ShipperTotDueCTE
GROUP BY Name, WeekEnding ),
PivCTE AS (
SELECT WeekEnding, [XRQ - Truck Ground] AS XRQ, [Cargo Transport 5] AS Cargo,
[Overnight J-Fast] AS Overnight, [ZY - Express] AS ZY, [Overseas - Deluxe] AS Overseas, ISNULL([XRQ - Truck Ground],0) + ISNULL([Cargo Transport 5],0) + ISNULL([Overnight J-Fast],0) + ISNULL([ZY - Express],0) + ISNULL([Overseas -Deluxe],0)
AS GrandTot
FROM SumByWeekEndCTE
PIVOT ( SUM(GrandTot) FOR Shipper IN ([XRQ - Truck Ground],[Cargo Transport 5], [Overnight J-Fast],[ZY - Express], [Overseas - Deluxe]) ) AS P )
SELECT TOP 5 WeekEnding, GrandTot, RANK() OVER (ORDER BY GrandTot DESC)
AS WeekRank, XRQ, ZY, Overseas, Overnight, Cargo
FROM PivCTE ORDER BY WeekRank;
USE [AdventureWorks2008];GO
CREATE FUNCTION [dbo].[SatDatesConverter](@orderdate datetime)
RETURNS datetimeASBEGINDECLARE @satdate datetimeSET @satdate = (SELECT DateAdd(d, 7- datepart(dw, @OrderDate), @OrderDate)) RETURN @satdateEND;
GO 9
Query 9 – SP, CTE-only approach
A stored procedure for a ranking of Top N vendors by Total Due amount; and, within each vendor, the Top N products based on Line Total (Due) for specified start/end dates.
USE [AdventureWorks2008];
GO
CREATE PROCEDURE dbo.usp_VendorProductRank
@TopN int, @TopY int, @BeginDate datetime, @EndDate datetime
AS
SET NOCOUNT ON;
;WITH VendCTE AS (
SELECT Ven.BusinessEntityID, Ven.Name AS VendorName, SUM(TotalDue) AS TotalDue, DENSE_RANK () OVER (ORDER BY SUM(TotalDue) DESC ) AS VendorRank
FROM Purchasing.Vendor Ven
INNER JOIN Purchasing.PurchaseOrderHeader poh ON poh.VendorID = Ven.BusinessEntityID
WHERE OrderDate >= @BeginDate AND OrderDate <= @EndDate
GROUP BY BusinessEntityID, Name ),
ProdCTE AS (
SELECT Ven.BusinessEntityID, prd.Name AS ProductName, SUM(LineTotal) AS ProductTotalDue, DENSE_RANK() OVER (PARTITION BY Ven.BusinessEntityID ORDER BY SUM(LineTotal) DESC) AS ProductRank
FROM Purchasing.Vendor ven
INNER JOIN Purchasing.PurchaseOrderHeader poh ON poh.VendorID = ven.BusinessEntityID
INNER JOIN Purchasing.PurchaseOrderDetail pod ON pod.PurchaseOrderID = poh.PurchaseOrderID
INNER JOIN Production.Product prd ON prd.ProductID = pod.ProductID
WHERE OrderDate >= @BeginDate AND OrderDate <= @EndDate
GROUP BY Ven.BusinessEntityID, prd.Name)
SELECT VC.VendorName, VC.VendorRank, CAST(VC.TotalDue AS NUMERIC (14,2)) AS TotalDue, PC.ProductName, PC.ProductRank, CAST(PC.ProductTotalDue AS NUMERIC (14,2) ) AS ProductTotalDue FROM VendCTE VC INNER JOIN ProdCTE PC ON PC.BusinessEntityID = VC.BusinessEntityID
WHERE VendorRank <= @TopN AND ProductRank <= @TopY
ORDER BY VendorRank, ProductRank
GO
EXEC dbo.usp_VendorProductRank 5,5,'2003-01-01', '2004-06-30'10
Query 9 – SP, CTE/Function approach
A stored procedure for a ranking of Top N vendors by Total Due amount; and, within each vendor, the Top N products based on Line Total (Due) for specified start/end dates.
CREATE PROCEDURE dbo.usp_TestProc1
@TopN int, @TopY int, @BeginDate datetime, @EndDate datetime
AS
SET NOCOUNT ON;
;WITH xCTE as (
SELECT TOP (@TopN) WITH TIES poh.VendorID, ven.Name AS VendorName, SUM(poh.TotalDue) AS TotalDue, DENSE_RANK() OVER (ORDER BY SUM(poh.TotalDue) DESC) AS VendorRank
FROM Purchasing.PurchaseOrderHeader poh
INNER JOIN Purchasing.Vendor ven ON ven.BusinessEntityID = poh.VendorID
WHERE OrderDate >= @BeginDate AND OrderDate <= @EndDate
GROUP BY poh.VendorID, ven.Name )
SELECT xCTE.VendorName, xCTE.VendorRank, CAST(xCTE.TotalDue AS NUMERIC (14,2)) AS TotalDue, C.ProductName, C.ProductRank, CAST(C.ProductLineTotal AS NUMERIC (14,2) ) AS ProductLineTotal
FROM xCTE
CROSS APPLY dbo.TestFn1 (xCTE.VendorID, @TopY, @BeginDate, @EndDate) AS C
GO
EXEC dbo.usp_TestProc1 5, 5,'2003-01-01', '2004-06-30'
USE [AdventureWorks2008];
GO
CREATE FUNCTION dbo.TestFn1
(@VendorID int, @TopY int, @StartDate datetime, @EndingDate datetime)
RETURNS TABLE
AS
RETURN
SELECT TOP (@TopY) WITH TIES poh.vendorid, prd.Name AS ProductName,
DENSE_RANK() OVER (PARTITION BY poh.vendorID ORDER BY
SUM(pod.LineTotal) DESC) AS ProductRank,
SUM(pod.LineTotal) AS ProductLineTotal
FROM Production.Product prd
INNER JOIN Purchasing.PurchaseOrderDetail pod ON pod.productid = prd.productid
INNER JOIN Purchasing.PurchaseOrderHeader poh
ON pod.PurchaseOrderid = poh.purchaseorderid
WHERE poh.VendorID = @VendorID AND OrderDate >= @StartDate
AND OrderDate <= @EndingDate
GROUP BY poh.vendorID, prd.Name
ORDER BY ProductLineTotal DESC
GO
11
Query 10 – Effective (‘As of’) Dates: Scalar UDF
USE [AdventureWorks2008];
GO
CREATE FUNCTION dbo.ProdStdCostAsOfDate
(@ProductID int, @AsOfDate datetime )
RETURNS MONEY
AS
BEGIN
DECLARE @StndCost money
SET @StndCost =
( SELECT StandardCost
FROM Production.ProductCostHistory pch
WHERE ProductID = @ProductID
AND StartDate =
(SELECT MAX(StartDate)
FROM Production.ProductCostHistory
WHERE ProductID = @Productid
AND StartDate <= @AsOfDate ) )
RETURN @StndCost
END;
GO
;WITH ProdStdCostCTE AS (
SELECT ProductNumber, Name,
CAST( dbo.ProdStdCostAsOfDate (Product.ProductID, '2002-01-01') AS NUMERIC (14,2) ) AS StandardCost
FROM Production.Product INNER JOIN Production.ProductCostHistory pch ON pch.ProductID = Product.ProductID )
SELECT ProductNumber, Name, StandardCost FROM ProdStdCostCTE WHERE StandardCost IS NOT NULL AND StandardCost > 700 ORDER BY StandardCost DESC;
A function which provides the commensurate standard product costbased on a specified productID numberand a desired ‘effective date.’ Example included.
12