某数据库的表结构如下:
表名:test
字段:
school  score
学校1    90
学校1    54
学校1    80
学校1    73

学校2    100
学校2    0
学校2    64
。。现在想查询出每所学校的及格率,即每所学校成绩>=60分的考生数量占该学校总考生数量的百分比
结果样式:
学校   及格率
学校1   XX%
学校2   XX%

这SQL该怎样写呢?感谢大家的帮助

解决方案 »

  1.   

    SELECT 
    school 学校 ,
    CONVERT(VARCHAR(20),
    (SELECT SUM(score ) FROM TEST WHERE school=T.schoo AND score >=60)*1.00/
    (SELECT SUM(score ) FROM TEST WHERE school=T.schoo))+'%' AS 及格率 
    FROM TEST T??
      

  2.   

    SELECT
       学校,
       NULLIF(SUM(CASE WHEN 分数 >=60 THEN 1 ELSE 0 END),0)*100./COUNT(*) AS 及格率
    FROM tb;
      

  3.   

    SELECT 
    school 学校 ,
    CONVERT(VARCHAR(20),
    (SELECT COUNT(score ) FROM TEST WHERE school=T.schooL AND score >=60 )*1.00/
    (SELECT COUNT(score ) FROM TEST WHERE school=T.schooL))+'%' AS 及格率 
    FROM TEST T改下,
      

  4.   

    -------------------------------------------
    --  Author : liangCK 小梁
    --  Comment: 小梁 爱 兰儿
    --  Date   : 2009-09-03 20:09:14
    -------------------------------------------
     
    --> 生成测试数据: @tb
    DECLARE @tb TABLE (school VARCHAR(5),score INT)
    INSERT INTO @tb
    SELECT '学校1',90 UNION ALL
    SELECT '学校1',54 UNION ALL
    SELECT '学校1',80 UNION ALL
    SELECT '学校1',73 UNION ALL
    SELECT '学校2',100 UNION ALL
    SELECT '学校2',0 UNION ALL
    SELECT '学校2',64 UNION ALL
    SELECT '学校3',50--SQL查询如下:SELECT
       school,
       ISNULL(NULLIF(SUM(CASE WHEN score >=60 THEN 1 ELSE 0 END),
                       0)*100./COUNT(*),0) AS 及格率
    FROM @tb
    GROUP BY school;/*
    school 及格率
    ------ ---------------------------------------
    学校1    75.00000000000
    学校2    66.66666666666
    学校3    0.00000000000(3 row(s) affected)
    */
      

  5.   


    --> 测试数据: @test
    declare @test table (school varchar(5),score int)
    insert into @test
    select '学校1',90 union all
    select '学校1',54 union all
    select '学校1',80 union all
    select '学校1',73 union all
    select '学校2',100 union all
    select '学校2',0 union all
    select '学校2',64select school,(select count(1) from @test d where score >60 and d.school = t.school)*1.0/count(1)
     from @test as t
    group by school 
    ----------学校1 .750000000000
    学校2 .666666666666
      

  6.   


    学习 nullif的用法 梁哥强
      

  7.   

    declare @test table (school varchar(5),score int)
    insert into @test
    select '学校1',90 union all
    select '学校1',54 union all
    select '学校1',80 union all
    select '学校1',73 union all
    select '学校2',100 union all
    select '学校2',0 union all
    select '学校2',64SELECT 
    school 学校 ,
    CONVERT(VARCHAR,
    CONVERT(DECIMAL(18,2),(SELECT COUNT(score ) FROM @test WHERE school=T.schooL AND score >=60 )*1.0/
    (SELECT COUNT(score ) FROM @test WHERE school=T.schooL)))+'%' AS 及格率 
    FROM @test TGROUP BY school
    (所影响的行数为 7 行)学校    及格率                             
    ----- ------------------------------- 
    学校1   0.75%
    学校2   0.67%(所影响的行数为 2 行)
      

  8.   

    DECLARE @tb TABLE (school VARCHAR(5),score INT)
    INSERT INTO @tb
    SELECT '学校1',90 UNION ALL
    SELECT '学校1',54 UNION ALL
    SELECT '学校1',80 UNION ALL
    SELECT '学校1',73 UNION ALL
    SELECT '学校2',100 UNION ALL
    SELECT '学校2',0 UNION ALL
    SELECT '学校2',64 UNION ALL
    SELECT '学校3',50SELECT
       school,ltrim(cast(SUM(CASE WHEN score >=60 THEN 1 ELSE 0 END)*100.0/COUNT(*)as decimal(18,2)))+'%'  AS 及格率
    FROM @tb
    GROUP BY school;/*
    school 及格率
    ------ ------------------------------------------
    学校1    75.00%
    学校2    66.67%
    学校3    0.00%(3 行受影响)
    */
      

  9.   

    declare @test table (school varchar(5),score int)
    insert into @test
    select '学校1',90 union all
    select '学校1',54 union all
    select '学校1',80 union all
    select '学校1',73 union all
    select '学校2',100 union all
    select '学校2',0 union all
    select '学校2',64 union all
    select '学校3',0SELECT 
    school 学校 ,
    CONVERT(VARCHAR,
    CONVERT(DECIMAL(18,2),(SELECT COUNT(score ) FROM @test WHERE school=T.schooL AND score >=60 )*1.0/
    (SELECT COUNT(score ) FROM @test WHERE school=T.schooL)))+'%' AS 及格率 
    FROM @test TGROUP BY school(所影响的行数为 8 行)学校    及格率                             
    ----- ------------------------------- 
    学校1   0.75%
    学校2   0.67%
    学校3   0.00%(所影响的行数为 3 行)
      

  10.   

    DECLARE @tb TABLE (school VARCHAR(5),score INT)
    INSERT INTO @tb
    SELECT '学校1',90 UNION ALL
    SELECT '学校1',54 UNION ALL
    SELECT '学校1',80 UNION ALL
    SELECT '学校1',73 UNION ALL
    SELECT '学校2',100 UNION ALL
    SELECT '学校2',0 UNION ALL
    SELECT '学校2',64 UNION ALL
    SELECT '学校3',50
    select distinct school ,per=
    sum(case when score>=60 then 1 else 0 end)over(partition by school)*1.0/
    count(*)over(partition by school)
     from @tb
     
     /*
    school per
    ------ ---------------------------------------
    学校1    0.750000000000
    学校2    0.666666666666
    学校3    0.000000000000
    */