SQLServer2012表表達式練習

表結構與數據:https://github.com/XuePeng87/TSQLV4git

練習1-1

練習內容:返回每一個僱員在orderdate列中的最大值
涉及的表:Sales.Orders
輸出的列:empid, maxorderdate
正確結果:9行
SELECT empid, MAX(orderdate) AS maxorderdate 
FROM Sales.Orders GROUP BY empid;

 練習1-2

練習內容:編寫一個派生表和Orders表之間的鏈接查詢,返回每一個僱員最大訂單日期的訂單
涉及的表:Sales.Orders
輸出的列:empid, maxorderdate
正確結果:10行
SELECT O1.empid, O2.maxorderdate, O1.orderid, O1.custid FROM Sales.Orders O1
JOIN 
(SELECT empid, MAX(orderdate) AS maxorderdate FROM Sales.Orders GROUP BY empid) AS O2 
ON O1.empid = O2.empid AND O1.orderdate = O2.maxorderdate;

練習2-1

練習內容:編寫一個查詢,計算按orderdate、orderid排序的每一個訂單的行號
涉及的表:Sales.Orders
輸出的列:orderid, orderdate, custid, empid, rownum
正確結果:830行
SELECT orderid, orderdate, custid, empid, 
ROW_NUMBER() OVER(ORDER BY orderdate, orderid) AS rownum 
FROM Sales.Orders ORDER BY orderdate, orderid;

練習2-2

練習內容:使用CTE,返回行號11至20的行
涉及的表:Sales.Orders
輸出的列:orderid, orderdate, custid, empid, rownum
正確結果:10行
WITH O AS 
(
	SELECT orderid, orderdate, custid, empid, 
	ROW_NUMBER() OVER(ORDER BY orderdate, orderid) AS rownum 
	FROM Sales.Orders
)
SELECT * FROM O WHERE rownum BETWEEN 11 AND 20
ORDER BY orderdate, orderid;

練習3

練習內容:使用CTE,遞歸返回領導Zoya Dolgopyatova(ID=9)的管理鏈
涉及的表:HR.Employees
輸出的列:empid, mgrid, firstname, lastname
正確結果:4行
WITH EmpsCTE AS 
(
	SELECT empid, mgrid, firstname, lastname 
	FROM HR.Employees WHERE empid = 9 

	UNION ALL

	SELECT P.empid, P.mgrid, P.firstname, P.lastname 
	FROM EmpsCTE AS C  
	JOIN HR.Employees AS P 
	ON C.mgrid = P.empid
) 
SELECT empid, mgrid, firstname, lastname FROM EmpsCTE;

練習4-1

練習內容:建立一個視圖,返回每位僱員每一年的總銷售量
涉及的表:Sales.Orders, Sales.OrderDetails
輸出的列:empid, orderyear, qty
正確結果:27行
IF OBJECT_ID('Sales.VEmpOrders') IS NOT NULL
	DROP VIEW Sales.VEmpOrders
GO
CREATE VIEW Sales.VEmpOrders
AS
SELECT empid, YEAR(orderdate) AS orderyear, SUM(qty) AS qty FROM 
Sales.Orders O JOIN Sales.OrderDetails D ON O.orderid = D.orderid
GROUP BY empid, YEAR(orderdate);
GO

練習4-2

練習內容:編寫一個查詢,返回每一個僱員截至到當前年(包含當前年)的總銷量
涉及的表:Sales.VEmpOrders
輸出的列:empid, orderyear, qty, runqty
正確結果:27行
SELECT empid, orderyear, qty, 
(SELECT SUM(qty) FROM Sales.VEmpOrders V2 
WHERE V2.empid = V1.empid AND V2.orderyear <= V1.orderyear) AS runqty 
FROM Sales.VEmpOrders V1

練習5-1

練習內容:建立一個內嵌函數,接受供應商ID和一個數量。返回這個供應商指定數量的最高的單價產品
涉及的表:Production.Products
輸出的列:productid, productname, unitprice
正確結果:2行
IF OBJECT_ID('Production.TopProducts') IS NOT NULL 
	DROP FUNCTION Production.TopProducts;
GO
CREATE FUNCTION Production.TopProducts 
(@supid AS INT, @n AS INT) 
RETURNS TABLE 
AS
RETURN 
SELECT TOP(@n) productid, productname, unitprice 
FROM Production.Products 
WHERE supplierid = @supid 
ORDER BY unitprice DESC;
SELECT * FROM Production.TopProducts(5, 2);

練習5-2

練習內容:使用CROSS APPLY運算符,爲每一個供應商返回兩個最昂貴的產品
涉及的表:Production.TopProducts, Production.Suppliers
輸出的列:supplierid, companyname, productid, productname, unitprice
正確結果:55行
SELECT S.supplierid, S.companyname, P.productid, P.productname, P.unitprice
From Production.Suppliers AS S 
CROSS APPLY 
Production.TopProducts(S.supplierid, 2) AS P;
相關文章
相關標籤/搜索