12
Transact-SQL Project SQL Server 2008 Management Studio SetFocus Business Intelligence Master’s Program Jeff Jacob, MBA P: (312) 772-6142 E1: [email protected] E2: [email protected]

JKJ_T SQL project code samples

Embed Size (px)

DESCRIPTION

T SQL samples

Citation preview

Page 1: JKJ_T SQL project code samples

Transact-SQL ProjectSQL Server 2008 Management Studio

SetFocus Business Intelligence Master’s Program

Jeff Jacob, MBAP: (312) 772-6142

E1: [email protected]

E2: [email protected]

Page 2: JKJ_T SQL project code samples

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

Page 3: JKJ_T SQL project code samples

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

Page 4: JKJ_T SQL project code samples

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

Page 5: JKJ_T SQL project code samples

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

Page 6: JKJ_T SQL project code samples

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

Page 7: JKJ_T SQL project code samples

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

Page 8: JKJ_T SQL project code samples

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

Page 9: JKJ_T SQL project code samples

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

Page 10: JKJ_T SQL project code samples

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

Page 11: JKJ_T SQL project code samples

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

Page 12: JKJ_T SQL project code samples

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