表結構與數據: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;