CREATE TABLE #MyTempTable (id int, firstName varchar(100) NULL, lastName varchar(200) NOT NULL)INSERT INTO #MyTempTable ...SELECT ...FROM #MyTempTable ...
SELECT {some stuff}INTO #MyTemporaryTableFROM {some things}...
DECLARE @MyTableTypeVariable TABLE (id int, firstName varchar(100) NULL, lastName varchar(200) NOT NULL)INSERT INTO @MyTableTypeVariable...SELECT...FROM @MyTableTypeVariable...
CREATE VIEW dbo.SalesSummaryAS SELECT {some complex query}GO
SELECT *FROM dbo.SalesSummary
SELECT A.Portfolio ,B.PortfolioID ,SUM(B.MarketValue) AS SumOfMV ,COUNT(B.SecID) AS [# of Securities]FROM ERTutAccounts AINNER JOIN ERTutPositions B ON A.PortfolioID = B.PortfolioIDGROUP BY ERTutAccounts.Portfolio ,ERTutPositions.PortfolioID;
SELECT A.Portfolio ,B.PortfolioID ,SUM(B.MarketValue) OVER (PARTITION BY A.Portfolio, B.PortfolioID) AS SumOfMV ,COUNT(B.SecID) OVER (PARTITION BY A.Portfolio, B.PortfolioID) AS [# of Securities]FROM ERTutAccounts AINNER JOIN ERTutPositions B ON A.PortfolioID = B.PortfolioID
CREATE TABLE #ERTutAccounts (PortfolioID INT IDENTITY(1,1), Portfolio VARCHAR(10)) INSERT INTO #ERTutAccountsSELECT 'A' UNION ALL SELECT 'B' UNION ALL SELECT 'C'CREATE TABLE #ERTutPositions (PortfolioID INT, MarketValue MONEY, SecID INT) INSERT INTO #ERTutPositionsSELECT 1, 50000, 1 UNION ALL SELECT 1, 100000, 2 UNION ALL SELECT 1, 150000, 3UNION ALL SELECT 2, 30000, 1 UNION ALL SELECT 2, 175000, 2 UNION ALL SELECT 2, 250000, 3UNION ALL SELECT 3, 40000, 1 UNION ALL SELECT 3, 150000, 2 UNION ALL SELECT 3, 250000, 3SELECT A.Portfolio ,A.PortfolioID ,SUM(B.MarketValue) AS SumOfMV ,COUNT(B.SecID) AS [# of Securities]FROM #ERTutAccounts AINNER JOIN #ERTutPositions B ON A.PortfolioID = B.PortfolioIDGROUP BY A.Portfolio ,A.PortfolioID;SELECT A.Portfolio ,B.PortfolioID ,SUM(B.MarketValue) OVER (PARTITION BY A.Portfolio, B.PortfolioID) AS SumOfMV ,COUNT(B.SecID) OVER (PARTITION BY A.Portfolio, B.PortfolioID) AS [# of Securities]FROM #ERTutAccounts AINNER JOIN #ERTutPositions B ON A.PortfolioID = B.PortfolioIDDECLARE @NumPortfolios INT = 100000-- Performance test (add some rows);WITH Tally (n) AS ( SELECT TOP (@NumPortfolios) ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM sys.all_columns a CROSS JOIN sys.all_columns b)INSERT INTO #ERTutAccountsSELECT Portfolio + CAST(n AS VARCHAR(10))FROM #ERTutAccountsCROSS APPLY Tally;WITH Tally (n) AS ( SELECT TOP 100000 ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM sys.all_columns a CROSS JOIN sys.all_columns b)INSERT INTO #ERTutPositionsSELECT 1 + ABS(CHECKSUM(NEWID())) % (3*@NumPortfolios+3) ,20000 + ABS(CHECKSUM(NEWID())) % 250000 ,1 + ABS(CHECKSUM(NEWID())) % 500FROM TallyDECLARE @Holder1 VARCHAR(10) ,@Holder2 INT ,@Holder3 MONEY ,@Holder4 INTPRINT 'GROUP BY'SET STATISTICS TIME ONSELECT @Holder1=A.Portfolio ,@Holder2=A.PortfolioID ,@Holder3=SUM(B.MarketValue) -- AS SumOfMV ,@Holder4=COUNT(B.SecID) -- AS [# of Securities]FROM #ERTutAccounts AINNER JOIN #ERTutPositions B ON A.PortfolioID = B.PortfolioIDGROUP BY A.Portfolio ,A.PortfolioID;SET STATISTICS TIME OFFPRINT 'WINDOW AGGREGATE W-DISTINCT'SET STATISTICS TIME ONSELECT DISTINCT @Holder1=A.Portfolio ,@Holder2=B.PortfolioID ,@Holder3=SUM(B.MarketValue) OVER (PARTITION BY A.Portfolio, B.PortfolioID) -- AS SumOfMV ,@Holder4=COUNT(B.SecID) OVER (PARTITION BY A.Portfolio, B.PortfolioID) -- AS [# of Securities]FROM #ERTutAccounts AINNER JOIN #ERTutPositions B ON A.PortfolioID = B.PortfolioIDSET STATISTICS TIME OFFDROP TABLE #ERTutAccountsDROP TABLE #ERTutPositions
GROUP BY SQL Server Execution Times: CPU time = 483 ms, elapsed time = 217 ms.WINDOW AGGREGATE W-DISTINCT SQL Server Execution Times: CPU time = 2151 ms, elapsed time = 774 ms
;WITH SomeCte as (select ...)MERGE...;