USE
tempdb
--Some
examples of ranking qualities and quantities. Run the entire
--script
and compare tables.
--By
C. Eric Cashon
CREATE
TABLE Results(
Color varchar(10),
Metal varchar(10),
Shape varchar(10),
Quantity int)
GO
--Load
sample data.
SET
NOCOUNT ON
INSERT
INTO Results VALUES('Red', 'Titanium', 'Circle', 8)
INSERT
INTO Results VALUES('Red', 'Iridium', 'Square', 8)
INSERT
INTO Results VALUES('Blue', 'Iridium', 'Square', 6)
INSERT
INTO Results VALUES('Red', 'Titanium', 'Triangle', 7)
INSERT
INTO Results VALUES('Green', 'Aluminum', 'Triangle', 2)
INSERT
INTO Results VALUES('Green', 'Titanium', 'Circle', 8)
INSERT
INTO Results VALUES('Red', 'Aluminum', 'Circle', 2)
INSERT
INTO Results VALUES('Blue', 'Iridium', 'Triangle', 4)
INSERT
INTO Results VALUES('Blue', 'Iridium', 'Square', 7)
INSERT
INTO Results VALUES('Red', 'Aluminum', 'Triangle', 6)
INSERT
INTO Results VALUES('Green', 'Titanium', 'Square', 9)
INSERT
INTO Results VALUES('Green', 'Titanium', 'Triangle', 4)
INSERT
INTO Results VALUES('Blue', 'Aluminum', 'Circle', 1)
INSERT
INTO Results VALUES('Red', 'Iridium', 'Square', 7)
INSERT
INTO Results VALUES('Blue', 'Titanium', 'Circle', 5)
INSERT
INTO Results VALUES('Green', 'Titanium', 'Circle', 2)
INSERT
INTO Results VALUES('Red', 'Aluminum', 'Square', 6)
INSERT
INTO Results VALUES('Red', 'Iridium', 'Triangle', 3)
INSERT
INTO Results VALUES('Green', 'Titanium', 'Triangle', 9)
INSERT
INTO Results VALUES('Blue', 'Iridium', 'Circle', 4)
INSERT
INTO Results VALUES('Green', 'Aluminum', 'Triangle', 5)
INSERT
INTO Results VALUES('Green', 'Iridium', 'Square', 1)
GO
--Combinations
of qualities without zero cases.
SELECT
Color, Metal, Shape, Sum(Quantity)SumOfValues
FROM
Results GROUP BY Color, Metal, Shape ORDER BY SumOfValues DESC
--Get
all the possible combinations of your qualitative values.
SELECT
* INTO Combinations FROM
(SELECT TOP 100 PERCENT T1.Color, T2.Metal,
T3.Shape FROM
Results T1 CROSS JOIN Results T2 CROSS JOIN
Results T3
GROUP BY T1.Color, T2.Metal, T3.Shape
ORDER BY T1.Color, T2.Metal, T3.Shape) T4
GO
--Create
a table to put every qualitative combination and the
--associated
value. Include zero values also.
CREATE
TABLE RankResults(
Color varchar(10),
Metal varchar(10),
Shape varchar(10),
SumOfValues int)
GO
--Open
a cursor and sum values for each possible combination.
--The
same as the first query but add combinations of qualities
--that
add to zero.
DECLARE
@Color varchar(10)
DECLARE
@Metal varchar(10)
DECLARE
@Shape varchar(10)
DECLARE
@RowCount int
DECLARE
ComboCursor CURSOR FAST_FORWARD FOR
SELECT
* FROM Combinations
OPEN
ComboCursor
FETCH
NEXT FROM ComboCursor INTO @Color, @Metal, @Shape
WHILE
@@FETCH_STATUS = 0
BEGIN
SET @RowCount = (SELECT COUNT(*) FROM
Results
WHERE Color = @Color AND
Metal = @Metal
AND Shape = @Shape)
IF @RowCount = 0
INSERT INTO RankResults VALUES(@Color,
@Metal, @Shape, 0)
ELSE
INSERT INTO RankResults (Color, Metal,
Shape, SumOfValues)
(SELECT T1.Color, T1.Metal,
T1.Shape,
SUM(T1.Quantity) FROM Results T1
WHERE Color = @Color AND Metal =
@Metal
AND Shape = @Shape GROUP BY
Color, Metal, Shape)
FETCH NEXT FROM ComboCursor INTO @Color,
@Metal, @Shape
END
CLOSE
ComboCursor
DEALLOCATE
ComboCursor
GO
--Return
the values to compare with the first query.
SELECT
* FROM RankResults ORDER BY SumOfValues DESC
GO
--Look
for values associated with each individual quality.
CREATE
TABLE AllQualities(
Qualities varchar(10))
CREATE
TABLE SecondResults(
Qualities varchar(10),
SumValues int)
GO
--Put
all the qualitative values in one column so that each can
--be
ranked.
INSERT
INTO AllQualities (Qualities)
(SELECT Color FROM Combinations
GROUP BY Color)
INSERT
INTO AllQualities (Qualities)
(SELECT Metal FROM Combinations
GROUP BY Metal)
INSERT
INTO AllQualities (Qualities)
(SELECT Shape FROM Combinations
GROUP BY Shape)
GO
--Look
at each value associated with each quality.
DECLARE
@Quality varchar(10)
DECLARE
QualCursor CURSOR FAST_FORWARD FOR
SELECT * FROM AllQualities
OPEN
QualCursor
FETCH
NEXT FROM QualCursor INTO @Quality
WHILE @@FETCH_STATUS = 0
BEGIN
INSERT INTO SecondResults(Qualities,
SumValues)
(SELECT @Quality, SUM(Quantity)
FROM Results
WHERE Color = @Quality OR Metal
= @Quality OR Shape = @Quality
GROUP BY Quantity)
FETCH NEXT FROM QualCursor INTO @Quality
END
CLOSE
QualCursor
DEALLOCATE
QualCursor
--Find
sum of values based on each individual quality.
SELECT
Qualities, SUM(SumValues)Total FROM SecondResults
GROUP BY
Qualities
ORDER BY Total DESC
--Find
sum of values based on groups of qualities. Notice the
--values
are all the same since the qualities are not independent.
SELECT
'Color' Quality, SUM(SumValues) Total FROM SecondResults
WHERE Qualities IN('Red', 'Green', 'Blue')
UNION
SELECT
'Metal', SUM(SumValues) Total FROM SecondResults
WHERE Qualities IN('Titanium', 'Iridium',
'Aluminum')
UNION
SELECT
'Shape', SUM(SumValues) Total FROM SecondResults
WHERE Qualities IN('Circle', 'Square',
'Triangle')
GO
--Clean
up
DROP
TABLE Results
DROP
TABLE Combinations
DROP
TABLE RankResults
DROP
TABLE AllQualities
DROP
TABLE SecondResults