数据库表Score如下:(只有0分、10分、20分、30分四种分数)
姓名  上午得分   下午得分
张三  10         20
张三  0          10
李四  20         0
李四  0          0
李四  30         20通过sql语句得到姓名  0分  10分  20分  30分
张三  1    2    1     0
李四  3    0    2     1求解sql数据库

解决方案 »

  1.   

    ----------------------------------------------------------------
    -- Author  :DBA_Huangzj(發糞塗牆)
    -- Date    :2013-03-31 01:00:04
    -- Version:
    --      Microsoft SQL Server 2008 R2 (SP1) - 10.50.2500.0 (Intel X86) 
    -- Jun 17 2011 00:57:23 
    -- Copyright (c) Microsoft Corporation
    -- Enterprise Edition on Windows NT 6.1 <X86> (Build 7601: Service Pack 1)
    --
    ----------------------------------------------------------------
    --> 测试数据:[huang]
    if object_id('[huang]') is not null drop table [huang]
    go 
    create table [huang]([姓名] varchar(4),[上午得分] int,[下午得分] int)
    insert [huang]
    select '张三',10,20 union all
    select '张三',0,10 union all
    select '李四',20,0 union all
    select '李四',0,0 union all
    select '李四',30,20
    --------------开始查询--------------------------select [姓名] 
    ,[0分]=SUM(CASE WHEN  [上午得分]=0 AND  [下午得分]=0 THEN 2 WHEN [上午得分]=0 AND  [下午得分]<>0 THEN 1
    WHEN [上午得分]<>0 AND  [下午得分]=0 THEN 1  ELSE 0 END )
    ,[10分]=SUM(CASE WHEN  [上午得分]=10 AND  [下午得分]=10 THEN 2 WHEN [上午得分]=10 AND  [下午得分]<>10 THEN 1
    WHEN [上午得分]<>10 AND  [下午得分]=10 THEN 1  ELSE 0 END )
    ,[20分]=SUM(CASE WHEN  [上午得分]=20 AND  [下午得分]=20 THEN 2 WHEN [上午得分]=20 AND  [下午得分]<>20 THEN 1
    WHEN [上午得分]<>20 AND  [下午得分]=20 THEN 1  ELSE 0 END )
    ,[30分]=SUM(CASE WHEN  [上午得分]=30 AND  [下午得分]=30 THEN 2 WHEN [上午得分]=30 AND  [下午得分]<>30 THEN 1
    WHEN [上午得分]<>30 AND  [下午得分]=30 THEN 1  ELSE 0 END )
    from [huang]
    GROUP BY [姓名]
    ORDER BY [姓名] DESC ----------------结果----------------------------
    /* 
    姓名   0分          10分         20分         30分
    ---- ----------- ----------- ----------- -----------
    张三   1           2           1           0
    李四   3           0           2           1
    */
      

  2.   


    --> 测试数据: @T
    declare @T table (姓名 varchar(4),上午得分 int,下午得分 int)
    insert into @T
    select '张三',10,20 union all
    select '张三',0,10 union all
    select '李四',20,0 union all
    select '李四',0,0 union all
    select '李四',30,20
    ;with m as
    (
    select 姓名,上午得分 col from @T 
    union all
    select 姓名,下午得分 from @T
    )
    select 姓名,
    sum(case when col=0 then 1 else 0 end) as [0分],
    sum(case when col=10 then 1 else 0 end) as [10分],
    sum(case when col=20 then 1 else 0 end) as [20分],
    sum(case when col=30 then 1 else 0 end) as [30分]
    from m group by 姓名 order by 姓名 desc
    /*
    姓名   0分          10分         20分         30分
    ---- ----------- ----------- ----------- -----------
    张三   1           2           1           0
    李四   3           0           2           1
    */
      

  3.   

    --如果是SQL Server 2000的话,不支持with表达式,可以这样:--> 测试数据: @T
    declare @T table (姓名 varchar(4),上午得分 int,下午得分 int)
    insert into @T
    select '张三',10,20 union all
    select '张三',0,10 union all
    select '李四',20,0 union all
    select '李四',0,0 union all
    select '李四',30,20select 姓名,
    sum(case when col=0 then 1 else 0 end) as [0分],
    sum(case when col=10 then 1 else 0 end) as [10分],
    sum(case when col=20 then 1 else 0 end) as [20分],
    sum(case when col=30 then 1 else 0 end) as [30分]
    from 
    (
        select 姓名,上午得分 col from @T 
    union all
    select 姓名,下午得分 from @T
    ) m group by 姓名 order by 姓名 desc
    /*
    姓名   0分          10分         20分         30分
    ---- ----------- ----------- ----------- -----------
    张三   1           2           1           0
    李四   3           0           2           1
    */
      

  4.   

    select 姓名,
    sum(case defen/10 when 0 then 1 else 0 end) as [0分],
    sum(case defen/10 when 1 then 1 else 0 end) as [10分],
    sum(case defen/10 when 2 then 1 else 0 end) as [20分],
    sum(case defen/10 when 3 then 1 else 0 end) as [30分]
    from (
    select 姓名,defen=上午得分 from tb 
    union all
    select 姓名,defen=下午得分 from tb
    ) m group by 姓名 order by 姓名 desc