Advertisement
EditorRUS

I suck imaginary cocks

Jun 8th, 2017
189
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
T-SQL 3.08 KB | None | 0 0
  1. IF OBJECT_ID ( 'dbo.GetEmployeeByStat', 'P' ) IS NOT NULL  
  2.     DROP PROCEDURE dbo.GetEmployeeByStat
  3. GO
  4.  
  5. IF OBJECT_ID ( 'tempdb..##EmployeeRankings') IS NOT NULL  
  6.     DROP TABLE ##EmployeeRankings
  7. GO
  8.  
  9. CREATE PROCEDURE dbo.GetEmployeeByStat (@Kind VARCHAR(5), @Stat VARCHAR(20))
  10. AS
  11. BEGIN
  12.     DECLARE @StatColumn VARCHAR(20)
  13.     IF @Stat = 'Orders' SET @StatColumn = 'OrdersAmt' ELSE
  14.     IF @Stat = 'Profit' SET @StatColumn = 'OrdersPrice' ELSE RAISERROR('Unknown stat', 0, 0)
  15.    
  16.     IF @Kind != 'Best' AND @Kind != 'Worst' RAISERROR('Unknown kind of order', 0, 0)   
  17.    
  18.     DECLARE @EmployeesNamesAndIDs TABLE (FullName VARCHAR(20), ID INT)
  19.     INSERT INTO @EmployeesNamesAndIDs (FullName, ID)
  20.     (
  21.         SELECT Employees.LastName + ' ' + Employees.FirstName, Employees.EmployeeID
  22.         FROM Employees
  23.     )
  24.    
  25.     DECLARE @EmployeesOrders TABLE (ID INT, Amt INT)
  26.     INSERT INTO @EmployeesOrders (ID, Amt)
  27.     (
  28.         SELECT Employees.EmployeeID, COUNT(Orders.OrderID)
  29.         FROM Employees, Orders
  30.         WHERE Orders.EmployeeID = Employees.EmployeeID
  31.         GROUP BY Employees.EmployeeID
  32.     )
  33.    
  34.     DECLARE @OrdersPrices TABLE (ID INT, EID INT, Price INT)
  35.     INSERT INTO @OrdersPrices (ID, EID, Price)
  36.     (
  37.         SELECT Orders.OrderID, Orders.EmployeeID, SUM([Order Details].UnitPrice*(1-[Order Details].Discount)*[Order Details].Quantity)
  38.         FROM Orders, [Order Details]
  39.         WHERE [Order Details].OrderID = Orders.OrderID
  40.         GROUP BY Orders.OrderID, Orders.EmployeeID
  41.     )
  42.    
  43.     DECLARE @EmployeesProfit TABLE (EID INT, FullProfit INT)
  44.     INSERT INTO @EmployeesProfit (EID, FullProfit)
  45.     (
  46.         SELECT OP.EID, SUM(OP.Price)
  47.         FROM Employees, @OrdersPrices as OP
  48.         WHERE OP.EID = Employees.EmployeeID
  49.         GROUP BY OP.EID
  50.     )
  51.    
  52.     CREATE TABLE ##EmployeeRankings (FullName VARCHAR(40), OrdersAmt INT, OrdersPrice INT)
  53.     INSERT INTO ##EmployeeRankings (FullName, OrdersPrice, OrdersAmt)
  54.     (
  55.         SELECT ENamesAndIDs.FullName, EP.FullProfit, EO.Amt
  56.         FROM @EmployeesNamesAndIDs as ENamesAndIDs, @EmployeesProfit as EP, @EmployeesOrders as EO
  57.         WHERE ENamesAndIDs.ID = EP.EID AND ENamesAndIDs.ID = EO.ID
  58.     )
  59.    
  60.     DECLARE @Data INT
  61.     DECLARE @TemporaryResult TABLE (Result INT)
  62.     DECLARE @Query NVARCHAR(200)
  63.     IF @Kind = 'Best' BEGIN
  64.         SET @Query = 'SELECT MAX(ER.' + @StatColumn + ') FROM ##EmployeeRankings AS ER'
  65.         INSERT INTO @TemporaryResult (Result) EXEC sp_executesql @Query
  66.         SET @Data = (SELECT * FROM @TemporaryResult)
  67.     END
  68.    
  69.     IF @Kind = 'Worst' BEGIN
  70.         SET @Query = 'SELECT MIN(ER.' + @StatColumn + ') FROM ##EmployeeRankings AS ER'
  71.         INSERT INTO @TemporaryResult (Result) EXEC sp_executesql @Query
  72.         SET @Data = (SELECT * FROM @TemporaryResult)
  73.     END
  74.    
  75.     DECLARE @StatString VARCHAR(40)
  76.     SET @StatString =
  77.         CASE @Kind
  78.             WHEN 'Best' THEN 'Best by '
  79.             WHEN 'Worst' THEN 'Worst by '
  80.         END
  81.    
  82.     SET @StatString = @StatString +
  83.         CASE @Stat
  84.             WHEN 'Orders' THEN 'orders'
  85.             WHEN 'Profit' THEN 'profit'
  86.         END
  87.     SET @Query = 'SELECT ''' + @StatString + ''', ER.FullName, ER.' + @StatColumn + ' FROM ##EmployeeRankings AS ER WHERE ER.' + @StatColumn + ' = ' + CONVERT(VARCHAR(100), @Data)
  88.     EXEC sp_executesql @Query
  89.    
  90. END
  91. GO
  92. EXEC dbo.GetEmployeeByStat 'Best', 'Profit'
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement