我认为你这个问题用单纯的一个sql语句是实现不了的,你可建一个中间表表结构为 部门编号,1月.....12月共13个字段,将记录插入到中间表中再想得出你要的结果就不难了。在pb里可以直接用crosstab形式的报表实现,在dephi里可能没有。不知道能不能帮你。

解决方案 »

  1.   

    用SQL数据库视图(语句)实现:
    1)先做1月份的考核成绩
    2)再做……到12月份的考核成绩。
    3)根据部门ID联接上述视图,并生成新的视图。(显示这个综合视图)数据量不大的情况下这样实现最简单明了。我水平不怎么的,性能顾不上!
    但这种不动脑精的方法是我的常规实现方法。
      

  2.   

    用一个SQL 旧可以实现了:
    select A.年,B.部门名称,
       1月份=case 月 when 1 then 考核结果 else 0 end,
       2月份=case 月 when 2 then 考核结果 else 0 end,
       3月份=case 月 when 3 then 考核结果 else 0 end,
       4月份=case 月 when 4 then 考核结果 else 0 end,
       5月份=case 月 when 5 then 考核结果 else 0 end,
       6月份=case 月 when 6 then 考核结果 else 0 end,
       7月份=case 月 when 7 then 考核结果 else 0 end,
       8月份=case 月 when 8 then 考核结果 else 0 end,
       9月份=case 月 when 9 then 考核结果 else 0 end,
       10月份=case 月 when 10 then 考核结果 else 0 end,
       11月份=case 月 when 11 then 考核结果 else 0 end,
       12月份=case 月 when 12 then 考核结果 else 0 end
    from 表1 A,表2 B
    where A.部门编号=B.部门编号
          and A.年='2001'一定可以,若不行,与我联系:
    QQ:69781465
      

  3.   

    交叉数据报表
    有时候需要旋转结果以便在水平方向显示列,而在垂直方向显示行。这就是所谓的创建 PivotTable®、创建交叉数据报表或旋转数据。假定有一个表 Pivot,其中每季度占一行。对 Pivot 的 SELECT 操作在垂直方向上列出这些季度:Year      Quarter      Amount
    ----      -------      ------
    1990      1           1.1
    1990      2           1.2
    1990      3           1.3
    1990      4           1.4
    1991      1           2.1
    1991      2           2.2
    1991      3           2.3
    1991      4           2.4生成报表的表必须是这样的,其中每年占一行,每个季度的数值显示在一个单独的列中,如:Year
     Q1
     Q2
     Q3
     Q4
     
    1990
     1.1
     1.2
     1.3
     1.4
     
    1991
     2.1
     2.2
     2.3
     2.4
     
    下面的语句用于创建 Pivot 表并在其中填入第一个表中的数据:USE Northwind
    GOCREATE TABLE Pivot
    ( Year      SMALLINT,
      Quarter   TINYINT, 
      Amount      DECIMAL(2,1) )
    GO
    INSERT INTO Pivot VALUES (1990, 1, 1.1)
    INSERT INTO Pivot VALUES (1990, 2, 1.2)
    INSERT INTO Pivot VALUES (1990, 3, 1.3)
    INSERT INTO Pivot VALUES (1990, 4, 1.4)
    INSERT INTO Pivot VALUES (1991, 1, 2.1)
    INSERT INTO Pivot VALUES (1991, 2, 2.2)
    INSERT INTO Pivot VALUES (1991, 3, 2.3)
    INSERT INTO Pivot VALUES (1991, 4, 2.4)
    GO下面是用于创建旋转结果的 SELECT 语句:SELECT Year, 
        SUM(CASE Quarter WHEN 1 THEN Amount ELSE 0 END) AS Q1,
        SUM(CASE Quarter WHEN 2 THEN Amount ELSE 0 END) AS Q2,
        SUM(CASE Quarter WHEN 3 THEN Amount ELSE 0 END) AS Q3,
        SUM(CASE Quarter WHEN 4 THEN Amount ELSE 0 END) AS Q4
    FROM Northwind.dbo.Pivot
    GROUP BY Year
    GO该 SELECT 语句还处理其中每个季度占多行的表。GROUP BY 语句将 Pivot 中一年的所有行合并成一行输出。当执行分组操作时,SUM 聚合中的 CASE 函数的应用方式是这样的:将每季度的 Amount 值添加到结果集的适当列中,在其它季度的结果集列中添加 0。如果该 SELECT 语句的结果用作电子表格的输入,那么电子表格将很容易计算每年的合计。当从应用程序使用 SELECT 时,可能更易于增强 SELECT 语句来计算每年的合计。例如:SELECT P1.*, (P1.Q1 + P1.Q2 + P1.Q3 + P1.Q4) AS YearTotal
    FROM (SELECT Year,
                 SUM(CASE P.Quarter WHEN 1 THEN P.Amount ELSE 0 END) AS Q1,
                 SUM(CASE P.Quarter WHEN 2 THEN P.Amount ELSE 0 END) AS Q2,
                 SUM(CASE P.Quarter WHEN 3 THEN P.Amount ELSE 0 END) AS Q3,
                 SUM(CASE P.Quarter WHEN 4 THEN P.Amount ELSE 0 END) AS Q4
         FROM Pivot AS P
         GROUP BY P.Year) AS P1
    GO
      

  4.   

    V_Lucky(Lucky) 的方法和我的是一样的。
    生成报表的表必须是这样的,其中每年占一行,每个季度的数值显示在一个单独的列中,如:
    格式应该是这样
    Year Q1  Q2  Q3  Q4
    1990 1.1 1.2 1.3 1.4
    1991 2.1 2.2 2.3 2.4另外还有一种方法就是建立中间表,先可以插入部门编号,然后用关联更新,一次更新一列(一个月),这种方法的效率也是比较高的。
     
      

  5.   

    select  A.年,B.部门名称,
            1月份=case  月  when  1  then  考核结果  else  0  end,
            2月份=case  月  when  2  then  考核结果  else  0  end,
            3月份=case  月  when  3  then  考核结果  else  0  end,
            4月份=case  月  when  4  then  考核结果  else  0  end,
            5月份=case  月  when  5  then  考核结果  else  0  end,
            6月份=case  月  when  6  then  考核结果  else  0  end,
            7月份=case  月  when  7  then  考核结果  else  0  end,
            8月份=case  月  when  8  then  考核结果  else  0  end,
            9月份=case  月  when  9  then  考核结果  else  0  end,
            10月份=case  月  when  10  then  考核结果  else  0  end,
            11月份=case  月  when  11  then  考核结果  else  0  end,
            12月份=case  月  when  12  then  考核结果  else  0  end
      from  表1  A,表2  B
      where  A.部门编号=B.部门编号
                  and  A.年='2001'
      group by B.部门编号
      
      

  6.   

    上面是补充的:
    group  by  B.部门编号前面忘记的
      

  7.   

    是sqlserver?oracle?因为他们分组内置函数不一样
      

  8.   

    SQLSERVER:
    同意上方法,大致是用SUM(CASE(月份,‘01’,考核结果
    ,0)) GROUP BY 部门
    oracle:
    大致是用SUM(decode(月份,‘01’,考核结果
    ,0)) GROUP BY 部门希望给分
      

  9.   

    V_Lucky(Lucky) 写得很详细啊!
      

  10.   

    SQLSERVER:
    同意上方法,大致是用
    select
    SUM(CASE 月份 when‘01’then 考核结果 else 0)) AS 'M01'
    SUM(CASE 月份 when‘02’then 考核结果 else 0)) AS 'M02'
    …… 
    from
    ……
    where 
    …… 
    GROUP BY 部门
    oracle:
    大致是用
    select
    SUM(decode(月份,‘01’,考核结果,0)) AS 'M01'
    SUM(decode(月份,‘02’,考核结果,0)) AS 'M02'
    …… 
    from
    ……
    where 
    …… 
    GROUP BY 部门
    希望给分