/* DW-OLAP-SQL.TXT                                    	*/
/* DATA WAREHOUSE OLAP SQL 				*/
/* Script file for SQL Server DBMS				*/

/* CREATE TABLES */
/* Run script DW-DBINIT.SQL */

/* ROLLUP EXAMPLE */
		/*+++++++++++++++ SQL SERVER  GROUP BY ONLY ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
	    /* +++ (provided to show a simplier SQL "rollup" example +++ */
			-- NOTE: SQL SERVER doesn't have "NATURAL" Join functionality joins must be explicit
			SELECT   DWPRODUCT.V_CODE, DWDAYSALESFACT.P_CODE, SUM(SALE_UNITS*SALE_PRICE) AS TOTSALES
			FROM     DWDAYSALESFACT  JOIN DWPRODUCT  
			ON DWDAYSALESFACT.P_CODE = DWPRODUCT.P_CODE
			JOIN DWVENDOR
			ON DWPRODUCT.V_CODE  = DWVENDOR.V_CODE  
			GROUP BY  DWPRODUCT.V_CODE, DWDAYSALESFACT.P_CODE
	
		/*+++++++++++++++ SQL SERVER  ROLLUP+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/

			SELECT   DWPRODUCT.V_CODE, DWDAYSALESFACT.P_CODE, SUM(SALE_UNITS*SALE_PRICE) AS TOTSALES
			FROM     DWDAYSALESFACT  JOIN DWPRODUCT  
			ON DWDAYSALESFACT.P_CODE = DWPRODUCT.P_CODE
			JOIN DWVENDOR
			ON DWPRODUCT.V_CODE  = DWVENDOR.V_CODE  
			GROUP BY  DWPRODUCT.V_CODE, DWDAYSALESFACT.P_CODE
			WITH ROLLUP
			ORDER BY DWPRODUCT.V_CODE, DWDAYSALESFACT.P_CODE




/*CUBE EXAMPLE */
		/*+++++++++++++++  SQL SERVER CUBE +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
	
			SELECT   DWTIME.TM_MONTH, DWDAYSALESFACT.P_CODE, SUM(SALE_UNITS*SALE_PRICE) AS TOTSALES
			FROM     DWDAYSALESFACT  JOIN DWPRODUCT 
			ON DWDAYSALESFACT.P_CODE = DWPRODUCT.P_CODE 
			JOIN DWTIME 
			ON DWDAYSALESFACT.TM_ID = DWTIME.TM_ID
			GROUP BY DWTIME.TM_MONTH, DWDAYSALESFACT.P_CODE
			WITH CUBE
			ORDER BY DWTIME.TM_MONTH, DWDAYSALESFACT.P_CODE
			



/* MATERIALIZED VIEW EXAMPLE */
	/*++++++++++++++++++++   SQL Server INDEXED VIEW (closest to ORACLE MATERIALIZED VIEW) +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
	/*	
	NOTES:
	- Indexed View must use the SCHEMABINDING option 
	- Two part naming for the objects (i.e. owner/object dbo.DWTIME)
	- First index created on the view must be both clustered and unique.
	- If there is a GROUP BY clause, the view may not have a HAVING, CUBE, or ROLLUP. 
	- May not have an OUTER JOIN , UNION clause. 
	- May not have DISTINCT or TOP clauses 
	- May not use derived tables or subqueries or other Views. 
	** refer to SQL SERVER documentation for other restrictions including  SESSION Variable setting
	
	*/
		CREATE VIEW SALES_MONTH_MV 
		WITH SCHEMABINDING AS  
		  SELECT	TM_YEAR, TM_MONTH, P_CODE, 
		                SUM(SALE_UNITS) SUM_SALE_UNITS, SUM(SALE_PRICE*SALE_UNITS) AS SUM_SALES
		      FROM	dbo.DWTIME T, dbo.DWDAYSALESFACT S 
		      WHERE 	S.TM_ID = T.TM_ID 
		      GROUP BY 	TM_YEAR, TM_MONTH, P_CODE
		
	
		SELECT * FROM SALES_MONTH_MV
		
		
		/* technically not an INDEXED VIEW until a UNIQUE CLustered Index is created *******/
	
			if ObjectProperty(object_id('SALES_MONTH_MV'),'IsIndexable') = 1
			BEGIN
				-- Create a clustered index, it MUST be unique
				CREATE UNIQUE CLUSTERED INDEX SALES_MONTH_MV_UNIQUE ON 
				SALES_MONTH_MV( TM_YEAR, TM_MONTH, P_CODE)
			END
			
		INSERT INTO DWDAYSALESFACT VALUES (207,10017,'SM-18277',1,6.99)
		
		
		SELECT * FROM SALES_MONTH_MV;
		
	
	
		/* DROP ALL OBJECTS CREATED */
			DROP VIEW SALES_MONTH_MV
			
			
			DELETE FROM DWDAYSALESFACT 
			WHERE TM_ID=207
			  AND CUS_CODE=10017
			  AND P_CODE='SM-18277'
			

	/*+++++++++++++++++++++++++++++++++ END SQL SERVER INDEXED VIEW EXAMPLE ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/