Click here to Skip to main content
15,887,683 members
Please Sign up or sign in to vote.
4.00/5 (1 vote)
See more:
Hello !
Here is my problem. I'm working on SQL Server 2008R2 with SSRS.
I got a simple dataset with two fields as for exemple :
Weight | Grade
---------------
50     | 1.20
50     | 1.00
50     | 1.12
50     | 2.34
50     | 1.75
50     | 1.73

And I would like to draw a chart with Grade in X axis and Sum(Weight) as Y axis.
The problem is, I've got a lot of different values for grades and I have to group the values in order to get one column for each range. If i haven't made myself clear yet, here is what I want :

Weight
200|
   |
150|
   |
100|
   |             |
50 |             |                 |
   |_____________|_________________|___|________
   0   0.5    1    1.3   1.5   1.7   2   2.5
                     Grade


That is to say we have 150 between 1 and 1.3, 100 between 1.7 and 2... etc.
I tried to do this with the intervals but it seems to be only for labels... I tried and googled without any explanation on how to do that. I can only manage to do a "round" on the "Grade" value, but that's not helpful as I want to be able to choose the values delimiting a specific range.

Thanks in advance for your help !
Posted

1 solution

Try to use ROUND()[^] function.

Example:
SQL
SELECT 1.23 [Value], ROUND(1.23,1) AS [RndValue]
UNION ALL
SELECT 1.24 [Value], ROUND(1.24,1) AS [RndValue]
UNION ALL
SELECT 1.25 [Value], ROUND(1.25,1) AS [RndValue]
UNION ALL
SELECT 1.26 [Value], ROUND(1.26,1) AS [RndValue]
UNION ALL
SELECT 1.27 [Value], ROUND(1.27,1) AS [RndValue]
UNION ALL
SELECT 1.28 [Value], ROUND(1.28,1) AS [RndValue]
UNION ALL
SELECT 1.29 [Value], ROUND(1.29,1) AS [RndValue]
UNION ALL
SELECT 1.30 [Value], ROUND(1.30,1) AS [RndValue]
UNION ALL
SELECT 1.31 [Value], ROUND(1.31,1) AS [RndValue]


Returned values:

ValueRndValues
1.231.20
1.241.20
1.251.30
1.261.30
1.271.30
1.281.30
1.291.30
1.301.30
1.311.30


You can "play" with modulo[^] too.

SQL
SELECT 1.23 [Value], ROUND(1.23,0) AS [RndValue], CONVERT(INT, 1.23 * 10 % 10) AS [Modulo]
UNION ALL
SELECT 1.24 [Value], ROUND(1.24,0) AS [RndValue], CONVERT(INT, 1.24 * 10 % 10) AS [Modulo]
UNION ALL
SELECT 1.25 [Value], ROUND(1.25,0) AS [RndValue], CONVERT(INT, 1.25 * 10 % 10) AS [Modulo]
UNION ALL
SELECT 1.26 [Value], ROUND(1.26,0) AS [RndValue], CONVERT(INT, 1.26 * 10 % 10) AS [Modulo]
UNION ALL
SELECT 1.27 [Value], ROUND(1.27,0) AS [RndValue], CONVERT(INT, 1.27 * 10 % 10) AS [Modulo]
UNION ALL
SELECT 1.28 [Value], ROUND(1.28,0) AS [RndValue], CONVERT(INT, 1.28 * 10 % 10) AS [Modulo]
UNION ALL
SELECT 1.29 [Value], ROUND(1.29,0) AS [RndValue], CONVERT(INT, 1.29 * 10 % 10) AS [Modulo]
UNION ALL
SELECT 1.30 [Value], ROUND(1.30,0) AS [RndValue], CONVERT(INT, 1.30 * 10 % 10) AS [Modulo]
UNION ALL
SELECT 1.31 [Value], ROUND(1.31,0) AS [RndValue], CONVERT(INT, 1.31 * 10 % 10) AS [Modulo]



ValueRndValuesModulo
1.231.002
1.241.002
1.251.002
1.261.002
1.271.002
1.281.002
1.291.003
1.301.003
1.311.003


... or ...
use CASE[^] expression ;)

SQL
USE A_TEST;  --my database

DECLARE @sql1 NVARCHAR(1000)
DECLARE @sql2 NVARCHAR(2000)

SET @sql1 = 'SELECT [GradeRng] = ' +
			'CASE  ' + 
			' WHEN [Grade] >=1 AND [Grade] <1.3 THEN ''1 to 1.29'' ' +
			' WHEN [Grade] >=1.3 AND [Grade] <1.7 THEN ''1.3 to 1.69'' ' +
			' WHEN [Grade] >=1.7 AND [Grade] <=2 THEN ''1.7 to 2'' ' +
			'END, [Weight] ' +
		'FROM Table_2 ' 
--EXEC (@sql1)

SET @sql2 = 'SELECT DT.[GradeRng], SUM(DT.[Weight]) AS [SumOfWeight] ' + 
			'FROM (' + @sql1 + ') AS DT ' +
			'GROUP BY DT.[GradeRng], DT.[Weight] ' +
			'ORDER BY  DT.[GradeRng], DT.[Weight] '
EXEC (@sql2)


results:

GradeRngSumOfWeight
1 to 1.29500
1.3 to 1.691000
1.7 to 21500
 
Share this answer
 
v2
Comments
Maciej Los 3-Apr-12 11:45am    
I'll be thankful for your vote ;)

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900