'How do I use temp tables in stored procedures?

I started learning SQL a few days ago and I'm loving it. I have this problem with stored procedures and I have been stuck for almost a week. Please I will appreciate any help on this

Using the AdventureWorks2016 DB

Name: CREATE PROCEDURE proc_TerritoryTop5Sales_ByProduct

  • Parameter: Territory Name (Passing Value)
  • b. Results set: Top 5 Products by year

(The following is for the results set, which will be created in your statement in order to pass in Territory Name to receive the Top 5 Products sold (Sum of Line Total) by each Year)

Hint: You may need to use a temp table/table variable combination.



Solution 1:[1]

CREATE PROCEDURE        dbo.Proc_TerritoryTop5Sales_ByProduct
                        @TerritoryName  VARCHAR(50)
AS
BEGIN
SET NOCOUNT ON;
CREATE TABLE            #ProductsList    (ProductName VARCHAR(50),TotalSales MONEY, OrderYear INT)

 INSERT INTO            #ProductsList   (ProductName,TotalSales, OrderYear)
 SELECT                 Dd.[Name], 
                        SUM(Cc.LineTotal) TotalSales, 
                        YEAR(Aa.OrderDate) [Year]
 FROM                   [Production].[Product] Dd
 FULL OUTER JOIN        [Sales].[SalesOrderDetail] Cc
 ON                     Cc.ProductID = Dd.ProductID
 FULL OUTER JOIN                [Sales].[SalesOrderHeader] Aa
 ON                     Aa.SalesOrderID = Cc.SalesOrderID
 FULL OUTER JOIN                [Sales].[SalesTerritory] Bb
 ON                     Aa.TerritoryID = Bb.TerritoryID
 WHERE                  Bb.[Name] = @TerritoryName
 GROUP BY               YEAR(OrderDate),Dd.[Name]
 ORDER BY               YEAR(OrderDate)DESC , TotalSales DESC 


 CREATE TABLE           #Top5SalesProduct   (ProductName VARCHAR(50),TotalSales MONEY, OrderYear INT)
 DECLARE                @YearlySale     INT
 SET                    @YearlySale =   (
                                            SELECT      TOP 1 OrderYear
                                            FROM        #ProductsList
                                        )
WHILE                   @YearlySale IS NOT NULL
BEGIN
INSERT  INTO            #Top5SalesProduct   (ProductName,TotalSales, OrderYear)
        SELECT          TOP 5 ProductName,TotalSales, OrderYear
        FROM            #ProductsList
        WHERE           OrderYear = @YearlySale
        ORDER BY        OrderYear DESC, TotalSales DESC 


DELETE  FROM                #ProductsList
        WHERE               OrderYear = @YearlySale
SET                         @YearlySale =   (
                                                SELECT      TOP 1 OrderYear
                                                FROM        #ProductsList
                                            )
END

SELECT      *
FROM        #Top5SalesProduct
ORDER  BY   OrderYear, TotalSales DESC

END


dbo.Proc_TerritoryTop5Sales_ByProduct 'France'

Solution 2:[2]

This is a pseudo code, but close to what you want. Substitute the column names & table name and it should take you a step closer.

CREATE PROCEDURE proc_TerritoryTop5Sales_ByProduct (@Territory VARCHAR(128))
AS 
 BEGIN 
    SELECT TOP 5 [products], [Year]  
    FROM AdventureWorks2016.SchemaName.TableName  
    WHERE Territory = @Territory 
    ORDER BY [year] DESC  
 END

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 user18466825
Solution 2 Rahim