sql语句中交叉报表的使用

sql语句中交叉报表的使用,第1张

要想实现上述数据格式,也就是用SQL语句实现交叉表查询,我们分两种情况分别介绍一下:

一、建立静态的交叉表,前提是列数固定,这里要用到 case when 语法,语句如下:

select 电子档案号,纳税人识别号,纳税人名称,

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语句中要用到的单引号, 使用两个连续的单引号进行转义


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/6660549.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-03-26
下一篇 2023-03-26

发表评论

登录后才能评论

评论列表(0条)

保存