SQL Fullcube
SQL
Download (.zip)
use pubs go
if exists (select * from sysobjects where name='automobile_sales_detail' and type='U') drop table automobile_sales_detail go
create table automobile_sales_detail ( rowid int not null identity , model char(6) null , year smallint not null check (year between 1985 and 2000), color char(5) null, units_sold int not null ) go
-- insert automobile_sales_detail values ('Chevy',1990,'Red',5) -- insert automobile_sales_detail values ('Chevy',1990,'White',87) -- insert automobile_sales_detail values ('Chevy',1990,'Blue',62) insert automobile_sales_detail values ('Chevy',1991,'Red',54) insert automobile_sales_detail values ('Chevy',1991,'White',95) insert automobile_sales_detail values ('Chevy',1991,'Blue',49) insert automobile_sales_detail values ('Chevy',1992,'Red',31) insert automobile_sales_detail values ('Chevy',1992,'White',54) insert automobile_sales_detail values ('Chevy',1992,'Blue',71) -- insert automobile_sales_detail values ('Ford',1990,'Red',64) insert automobile_sales_detail values ('Ford',1990,'White',62) insert automobile_sales_detail values ('Ford',1990,'Blue',63) -- insert automobile_sales_detail values ('Ford',1991,'Red',52) insert automobile_sales_detail values ('Ford',1991,'White',9) insert automobile_sales_detail values ('Ford',1991,'Blue',55) -- insert automobile_sales_detail values ('Ford',1992,'Red',27) insert automobile_sales_detail values ('Ford',1992,'White',62) insert automobile_sales_detail values ('Ford',1992,'Blue',39) go
-- The standard datacube works fine - but by design, does not generate -- missing combinations. For example, if I want to refer to output as a -- chart to see how many red Fords were sold, there is no such 0 row. -- While the easiest method would be to add a few dummy rows where there is missing values, -- I will attempt to do this instead with UNION and views or derived tables. select sum(units_sold),model,year,color from automobile_sales_detail group by model,year,color with cube go
-- The select statement works as I'd expect and unions all the -- real values with a dummy value of 0 for every row. select D.units_sold,D.model,D.year,D.color from automobile_sales_detail D UNION ALL select DISTINCT 0, A.model,C.year,B.color from automobile_sales_detail A CROSS JOIN automobile_sales_detail B CROSS JOIN automobile_sales_detail C
-- I'd like to take the previous query and make it a view. I could then do the -- CUBE on the view to achieve objective of fully populating the cube, and -- generate the missing values.
if exists (select * from sysobjects where name='FULLCUBE' and type='V') DROP VIEW FULLCUBE go
-- But trying to put same select into a view says there are ambiguous columns -- but every column is qualified. CREATE VIEW FULLCUBE ( units_sold, model, year, color ) AS ( select D.units_sold,D.model,D.year,D.color from automobile_sales_detail D UNION ALL select DISTINCT 0, A.model,C.year,B.color from automobile_sales_detail A CROSS JOIN automobile_sales_detail B CROSS JOIN automobile_sales_detail C ) go
select sum(units_sold),model,year,color from FULLCUBE group by model,year,color with cube go
-- as a variation, do it with a derived table instead of a view SELECT sum(T1.units_sold),T1.model,T1.year,T1.color from ( select D.units_sold,D.model,D.year,D.color from automobile_sales_detail D UNION select DISTINCT 0, A.model,C.year,B.color from automobile_sales_detail A CROSS JOIN automobile_sales_detail B CROSS JOIN automobile_sales_detail C ) as T1 group by T1.model,T1.year,T1.color with cube go
if exists (select * from sysobjects where name='auto_cube' and type='V') DROP VIEW auto_cube go
create view auto_cube (units, model, year, color) as select sum(units_sold), CASE WHEN (grouping(model)=1) THEN 'ALL' ELSE isnull(model,'????') END, CASE WHEN (grouping(year)=1) THEN 'ALL' ELSE isnull(convert(char(6),year),'????') END, CASE WHEN (grouping(color)=1) THEN 'ALL' ELSE isnull(color,'????') END from FULLCUBE group by model,year,color with cube go
select * from auto_cube
insert automobile_sales_detail values (NULL,1992,NULL,39) go
select sum(units_sold),model,year,color from automobile_sales_detail group by model,year,color with cube go
select * from auto_cube go
|