交叉报表列头排序时遇到的oracle问题—oracle ORA-12704:字符集不匹配、varchar2转化为nvarchar2字符缺失、case when else后的字符类型要一致

在做交叉报表列头的排序时,遇到这三个问题,下面具体来说一下。

设计的数据库的表结构如图1所示:

图1

要处出来student_name_,s.grade_,s.subject_name_,这三个属性,当时我是这样写的sql语句:

select  s.student_name_, s.grade_,  s.subject_name_,

case  s.subject_name_

when  ‘语文‘ then ‘A语文‘

when  ‘数学‘ then ‘B数学‘

when  ‘英语‘ then ‘C英语‘

else  s.subject_name_

end

from student s

执行之后报如图2的错误:

图2

后来发现出错的原因在于:subject_name_是nvarchar2类型的所以,‘’中的汉字是varchar2类型的,所以要把‘’中的汉字都转化为nvarchar2类型,于是将sql语句改成如下所示:

select  s.student_name_, s.grade_, s.subject_name_,

case s.subject_name_

when  cast(‘语文‘as  nvarchar2(10))  then cast(‘A语文‘asnvarchar2(10))

when  cast(‘数学‘as  nvarchar2(10))  then cast(‘B数学‘asnvarchar2(10))

when  cast(‘英语‘as  nvarchar2(10))  then cast(‘C英语‘asnvarchar2(10))

else  s.subject_name_

end

from student s

但是,运行之后效果不是我想的那样!结果如图3所示:

图3

很奇怪,“语文”和“数学”都很正常,英语就不正常!再执行语句

select  cast(‘英语‘ as  nvarchar2(10))  from student s  where s.subject_name_ =‘英语‘

结果是这样的,如图4所示:

图4

也就是 varchar2在向nvarchar2转化的时候造成了字符丢失,在找解决办法的时候在看到这篇文章http://blog.csdn.net/tobeistdo/article/details/5610287,才知道应该用to_char函数来进行varchar2与 nvarchar2的类型转换。于是,就又改成这样写了:

select s.student_name_,s.grade_,s.subject_name_,

case s.subject_name_

when to_char(‘语文‘)  then to_char(‘A语文‘)

when to_char(‘数学‘)  then to_char(‘B数学‘)

when to_char(‘英语‘)  then to_char(‘C英语‘)

else  s.subject_name_

end  as other_name_

from student s

结果,还是报错,如图5所示,还是字符集不匹配:

图5

查了很多牛人写的资料才知道:case的用法中when与else后的字符类型必须一致,但是这样还是不行,再把case后的字符类型改成与when、else后的字符类型一致才算ok,即:

select  s.student_name_,s.grade_,s.subject_name_,

case  to_char(s.subject_name_)

when to_char(‘语文‘)  then to_char(‘A语文‘)

when to_char(‘数学‘)  then to_char(‘B数学‘)

when to_char(‘英语‘)  then to_char(‘C英语‘)

else  to_char(s.subject_name_)

end  as other_name_

from student s

最终如图6所示:

图6

0
时间: 2024-09-30 05:10:28

交叉报表列头排序时遇到的oracle问题—oracle ORA-12704:字符集不匹配、varchar2转化为nvarchar2字符缺失、case when else后的字符类型要一致的相关文章

C++ 简单实现MFC ListControl 点击列头排序

说明: SetItemData可以为每一行绑定一个DWORD类型的变量.用GetItemData可以获得这个变量.举个例子,假设CListCtrl中你需要显示某个数据表中的记录,该表有个流水号主键ID,一般这个ID值本身没有什么意义,用户也不需要看,因此在CListCtrl的可见列中,你不需要显示.但往往做具体查询等操作时,你又需要用这个ID来完成.这时,用SetItemData将其绑定到每一行,将非常方便,用户操作哪一行,则用GetItemData可以得到对应记录的ID,直接用来做操作,很爽.

C# DataGridView 列自动排序时单元格背景色丢失

百度了下大家处理比较复杂 我是这么处理的,把设置颜色的代码写在RowPostPaint事件中,执行之前判断一下 当前行数,在最后一行时候执行,避免频繁设置颜色. private void DGV_CW_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e) { if (e.RowIndex == DGV_CW.RowCount-1) set_cw_grid(); // 设置grid颜色 }

锐浪 报表, 当多行交叉报表时,对多行交叉报表中自由格中的多个字段控件,进行颜色控制. 取值 判断等实现

需要注意的点是: 1 . 要对自由格中对应的 字段框的背景填充方式改为:填充,否则没有效果. 2 . 代码中红色部门代码: Column 为明细网络对象属性中的 列集合 中的 交叉列的 名称,  Report.RunningDetailGrid.Columns.Item("Column_2") 3.  蓝色部门 为自由格中 控件的索引位置 ,也可以根据字段框的名称来进行控制如:  contentCell.Controls.Item("FieldBox8") 代码如下

DataGridView使用技巧十三:点击列头实现升序和降序排序

DataGridView 列有三种排序模式.每一列的排序模式是通过该列的 SortMode 属性指定的,该属性可以设置为以下的 DataGridViewColumnSortMode 枚举值之一. DataGridViewColumnSortMode 值说明: Automatic 文本框列的默认排序模式.除非将列标头用于选择,否则单击列标头将自动按此列对 DataGridView 排序,并显示一个指示排序顺序的标志符号(向上的三角箭头:升序排序:向下的三角箭头:降序排序). NotSortable

ActiveReports 报表应用教程 (7)---交叉报表及数据透视图实现方案

原文:ActiveReports 报表应用教程 (7)---交叉报表及数据透视图实现方案 在 ActiveReports 中可以通过矩阵控件非常方便的实现交叉报表,同时还可以设置数据的分组.排序.过滤.小计.合计等操作,可以满足您报表的智能数据分析等需求.在矩阵控件中组的行数和列数由每个行分组和列分组中的唯一值的个数确定.同时,您可以按行组和列组中的多个字段或表达式对数据进行分组.在运行时,当组合报表数据和数据区域时,随着为列组添加列和为行组添加行,矩阵将在页面上水平和垂直增长. 在矩阵控件中,

jqgrid 中设置列不排序

背景 今天在做系统的功能时,当时有这么个需求:在添加了一行数据时,原本的排序的自动就不能再排序,也就是排序失效. 1. 使用onSortCol事件禁止排序列 当时使用了初始化时,使用onSortCol事件在初始化的时候,如果发现了添加行的标记为true的情况,就返回“stop”(返回stop之后列排序就失效了). 然后出现了一个问题,排序功能确实是被禁止掉了,但是排序的上下箭头还是依然顽强的工作,此种方法带了操作上的困扰. 2. 单独禁止掉指定的方法 在网上搜索了一阵之后,jqgrid确实提供了

什么是交叉报表

交叉报表,也是报表当中常见的类型,和分组报表一样,也是基本的报表类型.分组报表是只有行方向上有分组,而交叉报表则是行.列方向都有分组的报表.传统的报表一般都是通过专门的交叉报表生成向导来设计交叉报表.      交叉报表看似简单,但是在实际应用中,特别是处理中国式复杂报表时,作用巨大:主要是因为中国式报表的自身特点决定的. 避开纯技术的数据源和运算等等不说,单单说一说中国报表的形式.中国式报表一般都会有格线,这样会使得报表内容一目了然.在格线划分的时候,交叉形式的格线使用率就很高.这样也就解释了

datagrid拖动列头更换排列顺序

在做这个功能的时候在网上找了大量资料,发现都不适用,要不然就是代码太冗余,所以另起炉灶,自己封装了这个函数 下面是完整的代码: 1 <!DOCTYPE html> 2 <html> 3 <head lang="en"> 4 <meta charset="UTF-8"> 5 <title></title> 6 <link rel="stylesheet" href=&qu

灵活数据源的固定行列交叉报表的制作

论坛里,http://bbs.csdn.net/topics/390883416中提的问题,其目的是为了实现一个固定行列的交叉表,用SQL准备好固定行数的数据源非常麻烦.而润乾集算报表则有非常灵活的计算能力,能够充分利用问题特点应付各种非常规的计算需求. 这里就以链接中业务为背景,给出集算报表实现某种固定列交叉报表的方案. 报表背景         源数据例如以下: 现须要在报表中显演示样例如以下内容: 这里要求依照分类统计总记录数.并将每月的记录数分别填充到1-12月中.当中无数据的记录显示为