日期:2014-05-18  浏览次数:20585 次

VB sql分数段及相关问题
用数据库的知识做
学号 姓名 英语 数学 物理 化学 VB
200235882 张一山 81 75 63 58 87
200235883 张二山 81 75 63 58 87
200235882 张撒山 81 75 63 58 87
200235893 李的斯 71 87 73 78 97
200236004 王永民 91 58 83 88 67
200236016 李鹏 87 79 93 98 77
200236088 胡萝卜 51 95 69 76 37
200236099 赵来财 61 77 77 87 89
200236113 钱广 78 56 57 76 81
200236124 孙悟空 88 68 89 66 67
200236132 周全 21 75 73 87 57
200236152 吴大庆 96 85 93 67 17
200236182 赵无财 61 77 77 87 89
200235883 张说山 81 75 63 58 87
200235883 张的山 81 75 63 58 87
200235883 张飞山 81 75 63 58 87
200235891 李斯 71 87 73 78 97
200236000 王永民 91 58 83 88 67
200236010 李鹏 87 79 93 98 77
200236088 胡萝卜 51 95 69 45 37
200236099 赵来财 61 77 77 87 89
200236115 钱广 78 56 57 76 81
200236125 孙悟空 88 68 89 66 67
200236134 周全 21 75 73 87 57
200236152 吴大庆 96 85 93 67 17
200236181 赵无财 61 77 77 87 89
统计出分数段范围人数
范围 英语 数学 物理 化学 VB
>=90 3 5 .......
80-90 10 12 ......
....
....
<60 .... .... ....



然后就是算出每个人的加权平均分,进行排名~~~
谢谢各位大侠了~~我菜鸟在线等


------解决方案--------------------
SQL code
select '[>=90]'范围 ,
        sum(case when 英语>=90 then 1 else 0 end)英语,
        sum(case when 数学>=90 then 1 else 0 end)数学,
        sum(case when 物理>=90 then 1 else 0 end)物理,
        sum(case when 化学>=90 then 1 else 0 end)化学,
        sum(case when VB>=90 then 1 else 0 end)VB
from tb
union all
select '[80-90]'范围 ,
        sum(case when 英语 between 80 and 90 then 1 else 0 end)英语,
        sum(case when 数学 between 80 and 90 then 1 else 0 end)数学,
        sum(case when 物理 between 80 and 90 then 1 else 0 end)物理,
        sum(case when 化学 between 80 and 90 then 1 else 0 end)化学,
        sum(case when VB between 80 and 90 then 1 else 0 end)VB
from tb
....

------解决方案--------------------
SQL code
CREATE TABLE tb(ID int,Num int)
INSERT tb SELECT 1,2
UNION ALL ALL SELECT 6,2
UNION ALL SELECT 7,1
UNION ALL SELECT 8,5
UNION ALL SELECT 9,1
GO

--查询的存储过程
CREATE PROC p_Qry
@group VARCHAR(1000)
AS
SET NOCOUNT ON
IF @group LIKE '%[^0-9,]%'
BEGIN
    RAISERROR(N'"%s" 中包含非数字数据',1,16,@group)
    RETURN
END
--将字符串分拆为分组表
DECLARE @t TABLE(ID int IDENTITY,Groups varchar(10),a int,b int)
DECLARE @i int,@pid varchar(10)
SELECT @i=CHARINDEX(',',@group+',')
     ,@pid=LEFT(@group,@i-1)
     ,@group=STUFF(@group,1,@i,'')+','
     ,@i=CHARINDEX(',',@group)
INSERT @t SELECT 'ID<='+@pid,NULL,@pid
WHILE @i>1
BEGIN
    INSERT @t SELECT @pid+'<ID<='+LEFT(@group,@i-1),@pid,LEFT(@group,@i-1)
    SELECT @pid=LEFT(@group,@i-1)
        ,@group=STUFF(@group,1,@i,'')
        ,@i=CHARINDEX(',',@group)
END
INSERT @t SELECT 'ID>'+@pid,@pid,NULL

--根据分组表统计
SELECT b.Groups,Num=ISNULL(SUM(a.Num),0)
FROM tb a RIGHT JOIN @t b 
    ON (a.ID<=b.b OR b.b IS NULL)
        AND(a.ID>b.a OR b.a IS NULL)
GROUP BY b.ID,b.Groups
ORDER BY b.ID
GO

--调用存储过程进行查询
EXEC p_Qry '2,3,6'
/*--测试结果
Groups     Num         
---------- ----------- 
ID<=2      5
2<ID<=3    2
3<ID<=6    16
ID>6       7
--*/

------解决方案--------------------
SQL code
---------------------------------