Code Library
Home Submit Free Hosting Link To Us Contacts

SQL Fullcube

SQL Fullcube SQL SQL Fullcube 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





  • SQLFullcube


Tatet