我认为你这个问题用单纯的一个sql语句是实现不了的,你可建一个中间表表结构为 部门编号,1月.....12月共13个字段,将记录插入到中间表中再想得出你要的结果就不难了。在pb里可以直接用crosstab形式的报表实现,在dephi里可能没有。不知道能不能帮你。
解决方案 »
- delphi全局结构体为什么不可以用函数操作?
- 关于CPU ID 的问题 急...十分感谢
- udpclient或udpserver怎么接受数组数据啊??
- 请问高手:为什么我的ReportBuilder在预览时只有一页,但在打印时页数会不停地增加?,不停地打印很多頁?
- 谁有将阴历日期转为公历日期的程序代码??
- 问个问题:判断字符串采取相应的处理,我想用case语句,不想用if,怎么办?
- char是什么函数,是属于哪个对象下的?
- 如何改变Windows桌面
- 请问在向ImageList中动态添加图片时,如何设置成streth
- 真心请教 谁能告诉我.h文件转为.pas的方法、步骤和注意事项
- 该如何来设计这个QRreport,参与者有分
- 公司的头交了一个任务给我,让我解决以前公司做的三层结构的效率问题,还请大家帮忙发表下意见,谢谢
1)先做1月份的考核成绩
2)再做……到12月份的考核成绩。
3)根据部门ID联接上述视图,并生成新的视图。(显示这个综合视图)数据量不大的情况下这样实现最简单明了。我水平不怎么的,性能顾不上!
但这种不动脑精的方法是我的常规实现方法。
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
有时候需要旋转结果以便在水平方向显示列,而在垂直方向显示行。这就是所谓的创建 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
生成报表的表必须是这样的,其中每年占一行,每个季度的数值显示在一个单独的列中,如:
格式应该是这样
Year Q1 Q2 Q3 Q4
1990 1.1 1.2 1.3 1.4
1991 2.1 2.2 2.3 2.4另外还有一种方法就是建立中间表,先可以插入部门编号,然后用关联更新,一次更新一列(一个月),这种方法的效率也是比较高的。
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.部门编号
group by B.部门编号前面忘记的
同意上方法,大致是用SUM(CASE(月份,‘01’,考核结果
,0)) GROUP BY 部门
oracle:
大致是用SUM(decode(月份,‘01’,考核结果
,0)) GROUP BY 部门希望给分
同意上方法,大致是用
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 部门
希望给分