数据如下: 
table schedule: 
      日期,         擦黑板, 拖地,  打水 
       2008-05-01    A      B       C 
      2008-05-02    A      C       B 
      2008-05-03    B      A       C 
      。 
table student:
      编号,         姓名
       A            王小明
       B            李小波
       C            张小月         现在想知道学生 王小明、李小波、张小月在每个月份分别擦了几次黑板、拖了几次地、打了几次水 

解决方案 »

  1.   


    SELECT   日期, 姓名, SUM (擦黑板) 擦黑板, SUM (拖地) 拖地, SUM (打水) 打水
        FROM (SELECT   TO_CHAR (a.日期, 'yyyymm') 日期, b.姓名,
                       SUM (a.擦黑板) 擦黑板, 0 拖地, 0 打水
                  FROM schedule a, student b
                 WHERE a.擦黑板 = b.编号
              GROUP BY TO_CHAR (a.日期, 'yyyymm'), b.姓名
              UNION ALL
              SELECT   TO_CHAR (a.日期, 'yyyymm') 日期, b.姓名, 0 擦黑板,
                       SUM (a.拖地) 拖地, 0 打水
                  FROM schedule a, student b
                 WHERE a.拖地 = b.编号
              GROUP BY TO_CHAR (a.日期, 'yyyymm'), b.姓名
              UNION ALL
              SELECT   TO_CHAR (a.日期, 'yyyymm') 日期, b.姓名, 0 擦黑板, 0 拖地,
                       SUM (a.打水) 打水
                  FROM schedule a, student b
                 WHERE a.打水 = b.编号
              GROUP BY TO_CHAR (a.日期, 'yyyymm'), b.姓名)
    GROUP BY 日期, 姓名
      

  2.   

    SELECT  TO_CHAR (a.日期, 'yyyy-mm') 月份, b.姓名,
            SUM (case when a.擦黑板 =  b.姓名 then 1 else 0 end) 擦黑板, 
            SUM (case when a.拖地 =  b.姓名 then 1 else 0 end) 拖地, 
            SUM (case when a.打水 =  b.姓名 then 1 else 0 end) 打水
     FROM schedule a, student b
    group by TO_CHAR (a.日期, 'yyyy-mm'), b.姓名; 
      

  3.   

    1楼有解。
    2楼好像少了点东西。where?
      

  4.   

     
    SELECT  TO_CHAR (a.日期, 'yyyy-mm') 月份, b.姓名, 
            SUM (case when a.擦黑板 =  b.姓名 then 1 else 0 end) 擦黑板, 
            SUM (case when a.拖地 =  b.姓名 then 1 else 0 end) 拖地, 
            SUM (case when a.打水 =  b.姓名 then 1 else 0 end) 打水 
    FROM schedule a, student b 
    group by TO_CHAR (a.日期, 'yyyy-mm'), b.姓名; 
     
     2楼的应该是最简的了把!
      

  5.   

    经验证:
    SELECT  TO_CHAR (a.日期, 'yyyy-mm') 月份, b.姓名, 
            SUM (case when a.擦黑板 =  b.姓名 then 1 else 0 end) 擦黑板, 
            SUM (case when a.拖地 =  b.姓名 then 1 else 0 end) 拖地, 
            SUM (case when a.打水 =  b.姓名 then 1 else 0 end) 打水 
    FROM schedule a, student b 
    group by TO_CHAR (a.日期, 'yyyy-mm'), b.姓名;
    应该是最简单的。但还有种写法更简洁一些:
    SELECT  TO_CHAR (a.日期, 'yyyy-mm') 月份, b.姓名, 
            SUM (decode(a.擦黑板,b.姓名,1,0) 擦黑板, 
            SUM (decode(a.拖地,b.姓名,1,0) 拖地, 
            SUM (decode(a.打水,b.姓名,1,0) 打水 
    FROM schedule a, student b 
    group by TO_CHAR (a.日期, 'yyyy-mm'), b.姓名;
      

  6.   


    应该是SELECT   日期, 姓名, SUM (擦黑板) 擦黑板, SUM (拖地) 拖地, SUM (打水) 打水
        FROM (SELECT   TO_CHAR (a.日期, 'yyyymm') 日期, b.姓名,
                       SUM (1) 擦黑板, 0 拖地, 0 打水
                  FROM schedule a, student b
                 WHERE a.擦黑板 = b.编号
              GROUP BY TO_CHAR (a.日期, 'yyyymm'), b.姓名
              UNION ALL
              SELECT   TO_CHAR (a.日期, 'yyyymm') 日期, b.姓名, 0 擦黑板,
                       SUM (1) 拖地, 0 打水
                  FROM schedule a, student b
                 WHERE a.拖地 = b.编号
              GROUP BY TO_CHAR (a.日期, 'yyyymm'), b.姓名
              UNION ALL
              SELECT   TO_CHAR (a.日期, 'yyyymm') 日期, b.姓名, 0 擦黑板, 0 拖地,
                       SUM (1) 打水
                  FROM schedule a, student b
                 WHERE a.打水 = b.编号
              GROUP BY TO_CHAR (a.日期, 'yyyymm'), b.姓名)
    GROUP BY 日期, 姓名
      

  7.   

    二楼太马虎了
    SELECT  TO_CHAR (a.日期, 'yyyy-mm') 月份, b.姓名, 
            SUM (case when a.擦黑板 =  b.姓名 then 1 else 0 end) 擦黑板, 
            SUM (case when a.拖地 =  b.姓名 then 1 else 0 end) 拖地, 
            SUM (case when a.打水 =  b.姓名 then 1 else 0 end) 打水 
    FROM schedule a, student b 
    group by TO_CHAR (a.日期, 'yyyy-mm'), b.姓名; 应该是
    SELECT  TO_CHAR (a.日期, 'yyyy-mm') 月份, b.姓名, 
            SUM (case when a.擦黑板 =  b.编号 then 1 else 0 end) 擦黑板, 
            SUM (case when a.拖地 =  b.编号 then 1 else 0 end) 拖地, 
            SUM (case when a.打水 =  b.编号 then 1 else 0 end) 打水 
    FROM schedule a, student b 
    group by TO_CHAR (a.日期, 'yyyy-mm'), b.姓名; 
      

  8.   

    SELECT  TO_CHAR (a.日期, 'yyyy-mm') 月份, b.姓名, 
        count(dcode(a.擦黑板,b.编号,'1',null)) "擦黑板",
        count(dcode(a.拖地,b.编号,'1',null)) "拖地",
        count(dcode(a.打水,b.编号,'1',null)) "打水"
    FROM schedule a, student b 
    group by TO_CHAR (a.日期, 'yyyy-mm'), b.姓名; 
      

  9.   

    SELECT  TO_CHAR (a.日期, 'yyyy-mm') 月份, b.姓名, 
            SUM (case when a.擦黑板 =  b.姓名 then 1 else 0 end) 擦黑板, 
            SUM (case when a.拖地 =  b.姓名 then 1 else 0 end) 拖地, 
            SUM (case when a.打水 =  b.姓名 then 1 else 0 end) 打水 
    FROM schedule a, student b 
    group by TO_CHAR (a.日期, 'yyyy-mm'), b.姓名; 应该是 
    SELECT  TO_CHAR (a.日期, 'yyyy-mm') 月份, b.姓名, 
            SUM (case when a.擦黑板 =  b.编号 then 1 else 0 end) 擦黑板, 
            SUM (case when a.拖地 =  b.编号 then 1 else 0 end) 拖地, 
            SUM (case when a.打水 =  b.编号 then 1 else 0 end) 打水 
    FROM schedule a, student b 
    group by TO_CHAR (a.日期, 'yyyy-mm'), b.姓名; 
      

  10.   

    是sum 不是count:另
    decode只有oracle中有这个函数,sql2000中没有这个函数吧
      

  11.   

    没有decode函数 就用case when
      

  12.   

     SELECT count(擦黑板),count(拖地),count(打水 ) FROM schedule: 
    GROUP BY GROUPING SETS (擦黑板, 拖地, 打水, 日期) 
    look this.
      

  13.   

    http://fronkx.blog.hexun.com/17331585_d.html
      

  14.   

    这个不难啊 把月份截出来 根据姓名count了就可以了啊
      

  15.   

    也可以改为:
    SELECT  TO_CHAR (a.日期, 'yyyy-mm') 月份, b.姓名, 
            count(case when a.擦黑板 =  b.编号 then a.擦黑板) 擦黑板, 
            count(case when a.拖地 =  b.编号 then a.拖地) 拖地, 
            count(case when a.打水 =  b.编号 then a.打水) 打水 
    FROM schedule a, student b 
    group by TO_CHAR (a.日期, 'yyyy-mm'), b.姓名; 
      

  16.   

    或者改为:
    SELECT  TO_CHAR (a.日期, 'yyyy-mm') 月份, b.姓名, 
            count(case when a.擦黑板 =  b.编号 then 1111111) 擦黑板, 
            count(case when a.拖地 =  b.编号 then 1111111) 拖地, 
            count(case when a.打水 =  b.编号 then 1111111) 打水 
    FROM schedule a, student b 
    group by TO_CHAR (a.日期, 'yyyy-mm'), b.姓名;