一、建立静态的交叉表,前提是列数固定,这里要用到 case when 语法,语句如下:
sum(case 税种名称 when '营业税' then 实纳税额 end) as 营业税,
sum(case 税种名称 when '城建税' then 实纳税额 end) as 城市维护建设税,
sum(case 税种名称 when '教育费附加' then 实纳税额 end) as 教育费附加,
sum(case 税种名称 when '地方教育附加' then 实纳税额 end) as 地方教育附加
from dbo.税票
group by 电子档案号,纳税人识别号,纳税人名称
二、动态交叉表查询,前提是列数不固定,语句如下:
declare @sql varchar(8000)
set @sql =''
select @sql = @sql +','+税种名称+'=
sum(case 税种名称when'''+税种名称+'''then 实纳税额else 0 end)'
from dbo.税票 group by 税种名称
exec ('select 电子档案号,纳税人识别号,纳税人名称'+@sql+',sum(实纳税额) As 税额合计from dbo.税票group by 电子档案号,纳税人识别号,纳税人名称')
1、Java代码,classIds是报表文件需要的一个参数,在这里和给普通报表传递参数是一样的。2、蓝色为第二步,$P{classIds}根据{}大括号里面的名字去取值,这时候他的值是1。
Map parameters = new HashMap()
parameters.put("classIds", 1)
JasperPrint jasperPrint = JasperFillManager.fillReport(report,parameters, conn)
2、jrxml文件内容
<subDataset name="SubDataset3">
<parameter name="classId" isForPrompting="true" class="java.lang.Integer"/>
<queryString>
外部必须要有一个结果集,这一点,我的理解是JasperReport的容错处理。
<![CDATA[select a.name course_name,b.name course_type_name,c.marks,d.name as school_name,e.name as classname
from t_course a,t_course_type b,t_marks c,t_schoolmates d ,t_class e
where c.student_id=d.id and c.course_id=a.id and a.type_id= b.id and d.class_id=$P{classId}]]>
</queryString>
</subDataset>
<field name="classname" class="java.lang.String"/>
<field name="course_type_name" class="java.lang.String"/>
<field name="marks" class="java.lang.Integer"/>
--------------------------------------------------------------
<field name="school_name" class="java.lang.String"/>
<field name="course_name" class="java.lang.String"/>
<parameter name="classIds" class="java.lang.Integer"/>
我晕....这代码好乱你定义的@sql在赋值的时候, 没有对单引号进行转义, 所以整个字符串是断开的
把SQL语句中要用到的单引号, 使用两个连续的单引号进行转义
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)