2014年2月7日 星期五

[SQL] 北風資料庫 練習


  1. USE northwind  
  2. GO
  3. -- 飲料庫存總量
  4. SELECT c.CategoryName, SUM(p.UnitsInStock) 庫存總量, avg(p.UnitsInStock) 平均數
  5. FROM Categories c
  6. INNER JOIN Products p ON p.CategoryID = c.CategoryID
  7. WHERE c.CategoryName = 'Beverages'
  8. GROUP BY c.CategoryName

  9. --各種類的庫存狀況
  10. SELECT c.CategoryName [種類], p.ProductName [物品名稱], p.UnitsInStock [庫存]
  11. FROM Products p
  12. INNER JOIN Categories c ON p.CategoryID = c.CategoryID
  13. WHERE c.CategoryName = 'Beverages'
  14. --農產品庫存 + 平均庫存 + 最大最小平均差
  15. SELECT c.CategoryName, SUM(p.UnitsInStock) AS 庫存, avg(p.UnitsInStock) AS 平均, MAX(p.UnitsInStock) 最大,MIN(p.UnitsInStock) 最小, STDEV(p.UnitsInStock)
  16. FROM Categories c
  17. INNER JOIN Products p ON c.categoryID = p.categoryID
  18. WHERE c.CategoryName = 'Produce'
  19. GROUP BY c.CategoryName
  20. -- 1996年 銷售總額
  21. SELECT c.CategoryName 類別, ROUND(SUM(od.Quantity * (1-od.Discount)* od.UnitPrice),2) 銷售總額
  22. FROM Categories c
  23. JOIN Products p ON p.CategoryID = c.CategoryID
  24. JOIN [ORDER Details] od ON od.ProductID = p.ProductID
  25. JOIN Orders o ON o.OrderID = od.OrderID
  26. WHERE c.CategoryName = 'Beverages' AND Datepart(YEAR,o.OrderDate)='1996'
  27. GROUP BY c.CategoryName
  28. -- 展示類別 (用group by)
  29. SELECT c.CategoryName
  30. FROM Products p
  31. JOIN Categories c ON c.CategoryID=p.CategoryID
  32. GROUP BY c.CategoryName
  33. -- 展示類別 (用distinct)
  34. SELECT DISTINCT c.CategoryName
  35. FROM Categories c
  36. --1996年 超過15比以上訂單 員工
  37. SELECT e.EmployeeID [編號], e.LastName [名稱], COUNT(o.CustomerID) [訂單數]
  38. FROM orders o
  39. JOIN Employees e ON e.EmployeeID = o.EmployeeID
  40. WHERE DATEPART(YEAR, o.OrderDate) = '1996'
  41. GROUP BY e.EmployeeID, e.LastName
  42. HAVING COUNT(o.CustomerID) > 14
  43. ORDER BY e.EmployeeID
  44. --1996年 超過15比以上訂單 員工
  45. SELECT e.EmployeeID [編號], e.LastName [名稱], COUNT(*) [訂單數]
  46. FROM orders o
  47. JOIN Employees e ON e.EmployeeID = o.EmployeeID
  48. WHERE o.OrderDate BETWEEN '1996-01-01' AND '1996-12-31'
  49. GROUP BY e.EmployeeID, e.LastName
  50. HAVING COUNT(*) > 14
  51. ORDER BY e.EmployeeID
  52. -- 各類別庫存
  53. SELECT c.CategoryName [類別], SUM(p.UnitsInStock) [庫存], MIN(p.UnitsInStock) [最小庫存], MAX(p.UnitsInStock) [最大庫存]
  54. FROM Products p
  55. INNER JOIN Categories c ON p.CategoryID= c.CategoryID
  56. GROUP BY c.CategoryName
  57. --加拿大 員工與客戶訂單的統計
  58. SELECT EmployeeID, CustomerID,  COUNT(OrderID) 訂單數量
  59. FROM [Orders Qry]
  60. WHERE country IN('Canada')
  61. GROUP BY EmployeeID, CustomerID
  62. WITH ROLLUP
  63. --加拿大 員工與客戶訂單的統計 家小計總計
  64. SELECT isnull(CONVERT(nvarchar,EmployeeID),N'總計') AS EmployeeID, ISNULL(CustomerID, N'小計') AS CustomerID, COUNT(OrderID) 訂單數量
  65. FROM [Orders Qry]
  66. WHERE country IN('Canada')
  67. GROUP BY EmployeeID, CustomerID
  68. WITH ROLLUP
  69. --加拿大 員工與客戶訂單的統計 家小計總計
  70. SELECT isnull(CONVERT(nvarchar,EmployeeID),N'總計') AS EmployeeID, ISNULL(CustomerID, N'小計') AS CustomerID, COUNT(OrderID) 訂單數量
  71. FROM [Orders]
  72. WHERE shipcountry IN('Canada')
  73. GROUP BY EmployeeID, CustomerID
  74. WITH ROLLUP
  75. -- 員工訂單 + 業績
  76. SELECT e.EmployeeID, e.LastName, COUNT(o.OrderID) [訂單],ROUND(SUM( od.Quantity * ( 1 - od.Discount) *od.UnitPrice),0) 業績
  77. FROM Employees e
  78. JOIN Orders o ON o.EmployeeID=e.EmployeeID
  79. JOIN [ORDER Details] od ON od.OrderID = o.OrderID
  80. GROUP BY e.EmployeeID, e.LastName

2/8
  1. USE northwind
  2. GO
  3.  
  4.  
  5. --查詢客戶訂單及供應商的資料,只會顯示有有訂單的客戶
  6. SELECT DISTINCT c.CompanyName AS customers, p.ProductName , s.CompanyName 供應商
  7. FROM Customers c
  8. JOIN Orders o ON c.CustomerID=o.CustomerID
  9. JOIN [ORDER Details] od ON o.OrderID = od. OrderID
  10. JOIN Products p ON od.ProductID = p. ProductID
  11. JOIN Suppliers s ON p.SupplierID=s.SupplierID
  12. GROUP BY c.CompanyName, p.ProductName, s.CompanyName
  13.  
  14. --同上 (錯誤)但包含沒有客戶訂單的資料
  15. SELECT c.CompanyName, s.CompanyName
  16. FROM Customers c
  17. LEFT JOIN Orders o ON o.CustomerID = c.CustomerID
  18. JOIN [ORDER Details] od ON od.OrderID = o.OrderID
  19. JOIN Products p ON p.ProductID = od.ProductID
  20. JOIN Suppliers s ON s.SupplierID = p.SupplierID
  21. GROUP BY c.CompanyName,s.CompanyName
  22. ORDER BY s.CompanyName
  23.  
  24. --同上 但包含沒有客戶訂單的資料
  25. SELECT c.CompanyName, s.CompanyName
  26. FROM Customers c
  27. LEFT JOIN ( Orders o
  28. JOIN [ORDER Details] od ON od.OrderID = o.OrderID
  29. JOIN Products p ON p.ProductID = od.ProductID
  30. JOIN Suppliers s ON s.SupplierID = p.SupplierID )
  31.  ON o.CustomerID = c.CustomerID
  32. GROUP BY c.CompanyName,s.CompanyName
  33. ORDER BY s.CompanyName
  34.  
  35. --連結自身 找出住在相同城市的員工
  36. SELECT a.EmployeeID, a.FirstName, a.City, b.EmployeeID, b.FirstName, b.City
  37. FROM Employees a
  38. JOIN Employees b ON a.City = b.City
  39. WHERE a.EmployeeID > b.EmployeeID
  40.  
  41. --self join 員工與主管關係表 (示範用right 顯示右邊b 資料表基底的全部員工ID,請與下面參照)
  42. SELECT a.EmployeeID, a.FirstName, b.EmployeeID [主管ID], b.FirstName
  43. FROM Employees a
  44. RIGHT JOIN Employees b ON  b .EmployeeID = a.ReportsTo
  45.  
  46. --self join 員工與主管關係表 (正確)
  47. SELECT a.EmployeeID, a.FirstName, b.EmployeeID [主管ID], b.FirstName
  48. FROM Employees a
  49. LEFT JOIN Employees b ON  b .EmployeeID = a.ReportsTo
  50.  
  51. SELECT MAX(OrderDate) FROM Orders
  52. SELECT MIN(OrderDate) FROM Orders
  53.  
  54.  
  55. --最早的第一筆訂單產品 與最新的一筆訂單產品 (訂單編號 + 訂單日期 + 產品)
  56. SELECT
  57. o.OrderID 訂單編號,
  58. CONVERT(VARCHAR, o.OrderDate, 111) 訂單日期,
  59. p.ProductName 產品
  60. FROM Orders o
  61. JOIN [ORDER Details] od ON o.OrderID = od.OrderID
  62. JOIN Products p ON p.ProductID = od.ProductID
  63. WHERE o.OrderDate = (SELECT MAX(OrderDate) FROM Orders)
  64. OR  o.OrderDate = (SELECT MIN(OrderDate) FROM Orders)
  65. ORDER BY o.OrderDate

沒有留言:

張貼留言