精华内容
下载资源
问答
  • 该源码由源码天堂免费提供下载,源码实现了如何自定义界面列表视图。列表初始只显示一定数量的行单元,点击“显示。
  • 本篇我们介绍一种为 SQL 语句增加逻辑处理功能的方法:CASE 表达式。 SQL 中的 CASE 表达式可以根据不同条件产生不同的结果,实现类似于编程语言中的 IF-THEN-ELSE 逻辑功能。CASE 表达式支持两种形式:简单 CASE ...

    《SQL 从入门到精通》专栏目录


    上一篇我们学习了 SQL 中常见的日期时间函数和类型转换函数,熟练使用各种函数可以让我们的数据处理和分析工作事半功倍。

    本篇我们介绍一种为 SQL 语句增加逻辑处理功能的方法:CASE 表达式。

    SQL 中的 CASE 表达式可以根据不同条件产生不同的结果,实现类似于编程语言中的 IF-THEN-ELSE 逻辑功能例如,根据员工的 KPI 计算相应的涨薪幅度,根据考试成绩评出优秀、良好、及格等。

    CASE 表达式支持两种形式:简单 CASE 表达式搜索 CASE 表达式

    简单 CASE 表达式

    简单 CASE 表达式的语法如下:

    CASE expression
      WHEN value1 THEN result1
      WHEN value2 THEN result2
      ...
      [ELSE default_result]
    END
    

    表达式的计算过程如下图所示:

    ![simple case](https://img-blog.csdnimg.cn/20190724163844995.png?x-oss-process=image/watermark,typeZmFuZ3poZW5naGVpdGk,shadow10,textaHR0cHM6Ly90b255ZG9uZy5ibG9nLmNzZG4ubmV0,size16,colorFFFFFF,t70#pic_center =660x)

    首先计算 expression 的值;然后依次与 WHEN 列表中的值(value1,value2,…)进行比较,找到第一个相等的值并返回对应的结果(result1,result2,…);如果没有找到相等的值,返回 ELSE 中的默认结果;如果此时没有指定 ELSE,返回 NULL 值。

    以下示例使用简单 CASE 表达式将员工的部门编号显示为相应的名称:

    SELECT emp_name,
           CASE dept_id
             WHEN 1 THEN '行政管理部'
             WHEN 2 THEN '人力资源部'
             WHEN 3 THEN '财务部'
             WHEN 4 THEN '研发部'
             WHEN 5 THEN '销售部'
             WHEN 6 THEN '保卫部'
             ELSE '其他部门'
           END AS department
      FROM employee;
    

    首先判断部门编号是否等于 1,等于就显示为“行政管理部”;否则,如果部门编号等于 2, 显示为“人力资源部”;依次类推;如果部门编号不等于 1 到 6 中的任何值,显示为“其他部门”。该查询的结果如下(显示部分内容):

    simple case

    CASE 表达式的一个常见应用就是实现表的行列转换。假设存在以下学生成绩表:

    -- 创建成绩表 t_case,sname 为学生姓名,cname 为课程名称,score 为考试成绩
    CREATE TABLE t_case(sname varchar(10), cname varchar(10), score int);
    
    -- 插入测试数据
    INSERT INTO t_case(sname, cname, score) VALUES ('张三', '语文', 80);
    INSERT INTO t_case(sname, cname, score) VALUES ('李四', '语文', 77);
    INSERT INTO t_case(sname, cname, score) VALUES ('王五', '语文', 91);
    INSERT INTO t_case(sname, cname, score) VALUES ('张三', '数学', 85);
    INSERT INTO t_case(sname, cname, score) VALUES ('李四', '数学', 90);
    INSERT INTO t_case(sname, cname, score) VALUES ('王五', '数学', 60);
    INSERT INTO t_case(sname, cname, score) VALUES ('张三', '英语', 81);
    INSERT INTO t_case(sname, cname, score) VALUES ('李四', '英语', 69);
    INSERT INTO t_case(sname, cname, score) VALUES ('王五', '英语', 82);
    

    执行以上语句创建 t_case 表并且插入数据。该表中的数据如下:

    student

    每个学生的每科成绩都是一行数据。我们利用 CASE 表达式将其转换为按列显示的形式,最终的结果如下:

    student

    首先,执行以下查询语句:

    SELECT sname,
           CASE cname WHEN '语文' THEN score ELSE 0 END AS "语文",
           CASE cname WHEN '数学' THEN score ELSE 0 END AS "数学",
           CASE cname WHEN '英语' THEN score ELSE 0 END AS "英语"
      FROM t_case;
    

    第一个 CASE 表达式用于获取学生的语文成绩,cname 等于“语文”就返回考试成绩,不是“语文”就记为 0 分。第二个和第三个 CASE 表达式分别用于获取数学和英语成绩,原理和第一个 CASE 表达式相同。该语句执行的结果如下:

    student

    目前的结果还是 9 条记录。然后将每个学生的成绩合并成一条记录,此时需要使用到分组汇总的操作:

    SELECT sname,
           SUM(CASE cname WHEN '语文' THEN score ELSE 0 END) AS "语文",
           SUM(CASE cname WHEN '数学' THEN score ELSE 0 END) AS "数学",
           SUM(CASE cname WHEN '英语' THEN score ELSE 0 END) AS "英语"
      FROM t_case
     GROUP BY sname;
    

    在这里我们使用了 SUM 汇总函数和 GROUP BY 分组操作,这些内容是接下来两篇的主题。在此简单说明一下,GROUP BY 按照学生进行分组,这样每个学生最终只有一条记录;同时将学生每门课程的成绩使用 SUM 函数进行求和(每科成绩加上两个 0),还是得到每科的成绩。这样就实现了数据的行转列。

    学习完接下来两篇关于聚合函数和分组操作的内容之后,就能更容易地理解上面的示例了。

    简单 CASE 表达式在进行判断的时候,使用的是等值比较(=),只能处理简单的逻辑。如果想要进行复杂的逻辑处理,例如根据考试成绩评出优秀、良好、及格等,就需要使用更加强大的搜索 CASE 表达式。

    搜索 CASE 表达式

    搜索 CASE 表达式的语法如下:

    CASE
      WHEN condition1 THEN result1
      WHEN condition2 THEN result2
      ...
      [ELSE default_result]
    END
    

    表达式的计算过程如下图所示:

    ![search case](https://img-blog.csdnimg.cn/20190724165617307.png?x-oss-process=image/watermark,typeZmFuZ3poZW5naGVpdGk,shadow10,textaHR0cHM6Ly90b255ZG9uZy5ibG9nLmNzZG4ubmV0,size16,colorFFFFFF,t70#pic_center =575x) 按照顺序依次计算每个分支中的条件(condition1,condition2,…),找到第一个结果为真的分支并返回相应的结果(result1,result2,…);如果没有任何条件为真,返回 ELSE 中的默认结果;如果此时没有指定 ELSE,返回 NULL 值。

    所有的简单 CASE 表达式都可以替换为等价的搜索 CASE 表达式。我们可以将上一节的示例改写如下:

    SELECT emp_name,
           CASE 
             WHEN dept_id = 1 THEN '行政管理部'
             WHEN dept_id = 2 THEN '人力资源部'
             WHEN dept_id = 3 THEN '财务部'
             WHEN dept_id = 4 THEN '研发部'
             WHEN dept_id = 5 THEN '销售部'
             WHEN dept_id = 6 THEN '保卫部'
             ELSE '其他部门'
           END AS department
      FROM employee;
    

    首先判断部门编号等于 1 是否成立(为真),成立就显示为“行政管理部”;否则,判断部门编号等于 2 是否成立, 成立就显示为“人力资源部”;依次类推;如果部门编号不等于 1 到 6 中的任何值,显示为“其他部门”。查询结果参见上文中的简单 CASE 表达式示例。

    搜索 CASE 表达式通常用于处理更加复杂的逻辑条件,以下示例基于员工的月薪将他们的收入分为“高”、“中”、“低”三个等级:

    SELECT emp_name, salary,
           CASE 
             WHEN salary < 10000  THEN '低收入'
             WHEN salary < 20000  THEN '中收入'
             ELSE '高收入'
           END AS grade
      FROM employee;
    

    如果月薪小于 10000,显示为“低收入”;否则,如果月薪小于 20000(此时肯定大于等于 10000),显示为“中收入”;否则,月薪大于等于 20000,显示为“高收入”。该查询的结果如下(显示部分内容):

    searc example

    CASE 表达式除了可以用于查询语句的 SELECT 列表,也可以出现在其他子句中,例如 WHERE、ORDER BY 等。在第 6 篇中,为了解决空值在不同数据库中排序不同的问题,我们使用了 COALESCE 函数。以下示例使用 CASE 表达式实现了相同的效果:

    SELECT emp_name,
           CASE
             WHEN bonus IS NULL THEN 0
             ELSE bonus
             END AS bonus
      FROM employee
     WHERE dept_id = 2
     ORDER BY CASE
                WHEN bonus IS NULL THEN 0
                ELSE bonus
              END;
    

    ORDER BY 中的 CASE 表达式将奖金为空的数据转换为 0,确保空值在升序时排在最前;其他数据保持不变。该查询的结果如下:

    order

    CASE 表达式是标准的 SQL 功能,所有数据库都支持并且实现一致。除此之外,Oracle 还提供了一个专有函数:DECODE。

    DECODE 函数

    Oracle 中的 DECODE 函数可以实现类似于简单 CASE 表达式的功能:

    DECODE(expression, value1, result1, value2, result2, ...[, default_result ])
    

    该函数依次比较表达式 expression 与 valueN 的值,如果找到相等的值就返回对应的 resultN;如果没有匹配到任何相等的值,返回默认结果 defaultresult;如果此时没有提供 defaultresult,返回 NULL 值。

    以下语句利用 DECODE 函数将员工的部门编号显示为相应的名称:

    -- Oracle 实现
    SELECT emp_name,
           DECODE(dept_id, 1, '行政管理部',
                           2, '人力资源部',
                           3 ,'财务部',
                           4, '研发部',
                           5, '销售部',
                           6, '保卫部',
                              '其他部门') AS department
      FROM employee;
    

    该查询的结果与前文中的简单 CASE 表达式示例相同。DECODE 是 Oracle 专有函数,推荐大家使用标准的 CASE 表达式。

    MySQL 中的 DECODE 函数是一个解密函数,与此无关。

    小结

    CASE 表达式为 SQL 语句提供了逻辑处理的能力,可以基于不同的条件返回不同的结果。CASE 表达式支持两种形式:简单 CASE 表达式和搜索 CASE 表达式。

    练习题:编写 SQL 语句查询员工信息,按照部门编号进行排序,并且确保同一个部门中的女性员工排在男性员工之前。

    展开全文
  • 我给他的答复是,对不起,自定义报表的行列字段修改太频繁了,如果此类的都搞成log日志,那得要多少的空间啊??   但是另外一种情况可以设定表的更改记录的log日志查询,比如前段时间,一个用户问,怎么查看...

    前段时间有个用户打电话给我,苦兮兮的说,他们的自定义的报表版本的内容不知道给谁删除的干干静静,然后咬牙切齿的说,一定要设个blog,抓住这个乱改的家伙。

    我给他的答复是,对不起,自定义报表的行列字段修改太频繁了,如果此类的都搞成log日志,那得要多少的空间啊??

     

    但是另外一种情况可以设定表的更改记录的log日志查询,比如前段时间,一个用户问,怎么查看对于OB52(会计账期)的修改的log,目前他查询不到。

    去客户机器上看了一下,确实没有日志,系统没有配。

    于是告诉他,比较简单,总共分三步:

    第一步

    首先通过SE11,输入OB52对应的table名称T001b,查看对应的技术设置:


    技术设置中,设定“记录更改日志”


    对于这个表的设定就搞定了,但是系统还有一个控制的地方,需要做修改:

    第二步

    需要设定系统的参数

    TCODE:RZ10中增加一个参数,“rec/client”


    对于这个参数的描述,sap在线帮助中可是有详细的信息描述啊


    第三步

    修改完了以后,还需要对于服务器的服务进行重启,因为更改了“系统的参数”,更改参数以后再做测试就一切ok了

     

    不过就会预示着系统中会多不少的垃圾数据啊。这个可是要有心理准备的

    展开全文
  • Sql实现行列转换

    2013-08-06 18:46:00
    从MS Sql Server 2005微软就推出了pivot和unpivot实现行列转换,这极大的方便了我们存储数据和呈现数据。今天就对这两个关键字进行分析,结合实例讲解如何存储数据,如何呈现数据。 例如学生选课和成绩系统中就有...

    从MS Sql Server 2005微软就推出了pivot和unpivot实现行列转换,这极大的方便了我们存储数据和呈现数据。今天就对这两个关键字进行分析,结合实例讲解如何存储数据,如何呈现数据。

    例如学生选课和成绩系统中就有一张表,该表存储了学生的课程成绩,我们无法去预料课程的多少,因此一般表会设计为下面这样:

    图1

    最后一列是课程编号,这样无论开学之后还会不会增加课程供学生选择,都没有关系。那么我们要呈现给用户看的报表一般是这样的:

    图2

    可以看到存储数据的时候采用的是列式存储,最终呈现的数据是行式显示,如何实现?下面详细分析讲解:

    创建表语句

    USE [master]
    GO
    
    /****** Object:  Table [dbo].[Table_1]    Script Date: 08/06/2013 13:55:39 ******/
    SET ANSI_NULLS ON
    GO
    
    SET QUOTED_IDENTIFIER ON
    GO
    
    SET ANSI_PADDING ON
    GO
    
    CREATE TABLE [dbo].[Table_1](
    	[name] [varchar](50) NOT NULL,
    	[score] [real] NOT NULL,
    	[subject_id] [int] NOT NULL
    ) ON [PRIMARY]
    
    GO
    
    SET ANSI_PADDING OFF
    GO


    插入测试数据

    insert into [master].[dbo].[Table_1] ([name],[score],[subject_id]) values( 	'张三'	,	90	,	1	);
    insert into [master].[dbo].[Table_1] ([name],[score],[subject_id]) values( 	'张三'	,	80	,	2	);
    insert into [master].[dbo].[Table_1] ([name],[score],[subject_id]) values( 	'张三'	,	70	,	3	);
    insert into [master].[dbo].[Table_1] ([name],[score],[subject_id]) values( 	'王五'	,	50	,	1	);
    insert into [master].[dbo].[Table_1] ([name],[score],[subject_id]) values( 	'王五'	,	40	,	2	);
    insert into [master].[dbo].[Table_1] ([name],[score],[subject_id]) values( 	'李四'	,	60	,	1	);


    现在查询下Table_1中的数据即为图1中的结果,现在我们要得到图2的结果,那么使用下面的语句:

    SELECT [name],[1],[2],[3]
    FROM [master].[dbo].[Table_1]
    pivot
    (
      sum(score) for subject_id in ([1],[2],[3])
    ) as pvt
    GO


    如果本身数据库表存储的就是图2那样,要变成图1的方式呈现,那就需要用unpivot,可以这样做:

    SELECT [name],[subject_id],[score]
    FROM
    (
        SELECT [name],[1],[2],[3]
    	FROM [master].[dbo].[Table_1]
    	pivot
    	(
    	  sum(score) for subject_id in ([1],[2],[3])
    	) as pvt
    ) p
    unpivot
    (
    	score for subject_id in([1],[2],[3])
    ) as unpvt


    当然我还是在Table_1的基础上先用pvt转为为行式存储的方式,再用unpivot进行列式呈现。

     

    展开全文
  • 从MS Sql Server 2005微软就推出了pivot和unpivot实现行列转换,这极大的方便了我们存储数据和呈现数据。今天就对这两个关键字进行分析,结合实例讲解如何存储数据,如何呈现数据。 例如学生选课和成绩系统中就有...
  • C语言计算行列式以及代数余子式的函数 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法...

    C语言计算行列式以及代数余子式的函数

    #include<stdio.h>
    #define N 50
    double algebraic_cofactor(double P[N][N],int m,int a,int b);
    double determinant(double P[N][N],int m);
    
    void main()
    {
    	double P[N][N];//待求矩阵
    	int m,a,b;
    }
    
    //求代数余子式;m为阶数;a、b分别为元素所在的行与列
    double algebraic_cofactor(double P[N][N],int m,int a,int b)
    {	
    	int i,j,x,z;
    	double sum;
    	if(m<2) printf("输入错误,矩阵小于2阶");
    	else if(m==2) sum=P[m-a][m-b];
    	else
    	{
    		double Q[N][N]={0};
    		x=0;
    		for(i=0;i<m;i++)//创造一个m-1阶的矩阵(除去所求元素所在的行和列)
    		{
    			if(i==a-1) continue;
    			z=0;
    			for(j=0;j<m;j++)
    			{
    				if(j==b-1) continue;
    				Q[x][z]=P[i][j];
    				z++;
    			}
    			x++;
    		}
    		sum=determinant(Q,m-1);//求行列式
    	}
    	if((a+b)%2!=0) sum*=-1;
    	return sum;
    }
    
    //求行列式;m为阶数
    double determinant(double P[N][N],int m)
    {
    	int k;
    	double sum=0;
    	for(k=0;k<m;k++)
    	{
    		if(P[0][k]==0) continue;
    		else sum+=algebraic_cofactor(P,m,1,k+1)*P[0][k];//求代数余子式
    	}
    	return sum;
    }
    

    主要思路是通过代数余子式函数与行列式函数相互调用求解,由此可拓展出矩阵求逆的函数:

    void main()
    {
    	double P[N][N];//待求矩阵
    	double Q[N][N];//待求逆矩阵
    	int m,a,b;
    }
    
    //求逆矩阵;m为阶数
    void inverse_matrix(double P[N][N],double Q[N][N],int m)
    {
    	int i,j,k,l;
    	double A,B;
    	A=determinant(P,m);
    	if(A!=0) 
    	{
    		for(i=0;i<m;i++)
    			for(j=0;j<m;j++)
    				Q[i][j]=algebraic_cofactor(P,m,i+1,j+1);//计算伴随矩阵
    		B=1/A;
    		matrix_X_num(Q,B,m,m);
    		transpose(Q);//矩阵转置
    	}
    	else printf("错误:矩阵不可逆");
    }
    
    //矩阵转置
    void transpose(double P[N][N])
    {
    	double T[N][N];
    	int i,j;
    	for(i=0;i<N;i++)
    		for(j=0;j<N;j++)
    			T[j][i]=B[i][j];
    	for(i=0;i<N;i++)
    		for(j=0;j<N;j++)
    			B[i][j]=T[i][j];
    }
    
    展开全文
  • 那如果想要一个对象绑定一列怎么办呢,如何让DataGrid控件实现行固定,列不断增加?其实DataGrid控件实际上是仅支持一个维度的集合,为啥DataGrid有行和列? DataGrid的可视树中是根本没有所谓列的概念的,只有行和...
  • 我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客: 全新的界面设计 ,将会带来全新的写作体验; 在创作中心设置你喜爱的
  • C# 获取到要操作的窗体句柄后,怎么操纵 MSFlexGridWndClass 表格控件里的行列内容(的增加数据、删除数据、获取数据) 有没有相关的资料?
  • 如何规范设计表格

    2016-05-11 16:39:15
    这是一个非常简单的table应用的例子,它的1px边框及行列的长宽设置使得整个的表格表现出来的内容更直观易读。 这个table是对上面那个的改进,增加了背景色并减少了横向border的数量,使得表格数据垂直方向的对比性...
  • 对于已经建好的数据库表,可以采用两种方法来修改 ...第二行是重新在表里增加行列设置自增长 alter table 表名 drop column 列名 alter table 表名 add 列名int identity(1,1) 2、通过SQL Server Management St...
  • 随着移动电商热度的不断增加,许多的商家是开始慢慢的加入到移动电商的行列当中,那么你们知道设计开发移动电商系统的吗?延誉电商为您答疑解惑! 1.规划阶段 前规划阶段的主要任务是进行建立数据库的必要性及可行...
  • 近日,周杰伦快手直播首秀刷爆了朋友圈,直播当天快手...现在许多明星都加入了直播的行列,通过直播带货快速获得利益,然而明星直播带货失败的案例越来越多。有一些甚至是惨败收场,让一些企业血赔。明星在抖音、快速
  • 通过在现有的Internet中增加一层新的网络架构,将网站的内容发布到最接近用户的网络的“边缘”,使用户可以就近取得内容,以提高用户访问网站的响应速度,目前国外的CDN技术已经是如火如荼,而国内也已经是异军突起...
  • C# 技术开发

    2013-01-31 14:20:23
    C#开发技术,Datagrid中使用单元按钮。 如何设置Datagrid,如何增加、删除行列。 如何建立数据源。
  • WPF Grid 用 C# 代码后台设置 ... 编者:乌龙哈里 2017-02-21 参考: ...System.Windows.Controls 命名空间 ...WPF如何动态删除 Grid 行 ...动态增加行列及控件放置 设置Grid的行列尺寸 正文: 一、...
  • 处理刚才的股票数据给股票涨跌幅数据增加行列索引,显示效果更佳4 DataFrame4.1 DataFrame结构4.2 DatatFrame的属性4.3 DatatFrame索引的设置**4.3.1修改行列索引值**4.3.2 重设索引4.3.3 以某列值设...
  • selenium处理table表格

    2017-05-05 11:33:00
    你会说我们可以根据xpath定位到这个cell的行列,然后getText(),不错,但是页面的表格经常都不是固定的,如果这个表格增加或删除一些行列如何处理? 我们可以把这个问题抽象出来,所有的html table不外乎是由 ...
  • Matlab之图片拼接

    2019-10-21 14:23:06
    1.使用Matlab建立.m文件,具体如何建立见文章: Matlab基础之.m文件创建及使用 2.我写了两份代码可供参考 代码一 %图片合并,可以实现将一组图片变为统一规格尺寸(默认第一张图的尺寸) %可以自定义行列数拼合...
  • StringGrid使用全书

    2011-04-08 09:15:00
    StringGrid行列增加和删除 如何编写使StringGrid中的一列具有Check功能,和CheckBox效果一样 StringGrid组件Cells内容分行显示在Tstringgrid.ondrawcell事件中 在StringGrid怎样制作只读的列...
  • Pandas常规操作汇总

    2019-11-06 15:27:12
    文章汇总了自己在使用的过程中遇到的一些问题,自己记录的同时...3. pandas删除行删除列,增加增加列 4. pandas数据标准化 5.Python-Pandas 如何shuffle(打乱)数据? 1. 在处理数据时需要找到其中的缺失值...
  • 如何提取word中的表格内容,对合并的行列内容能够准确提取,用python可以实现吗? 插入链接与图片 链接: link. 图片: 带尺寸的图片:居中的图片: 居中并且带尺寸的图片: 当然,我们为了让用户更加便捷,...
  • pandas(三)DataFrame修改

    2019-12-22 10:01:42
    如何改变Series和DataFrame对象? 增加或重排: 重新索引 重新索引: .reindex()能够改变或重排Series和DataFrame索引 .reindex() 参数 说明 index, columns 新的行列索引 fill_value 重新索引中,用于...
  • StringGrid的一些操作

    千次阅读 2006-04-19 15:05:00
    StringGrid行列增加和删除如何编写使StringGrid中的一列具有Check功能,和CheckBox效果一样StringGrid组件Cells内容分行显示在Tstringgrid.ondrawcell事件中在StringGrid怎样制作只读的列在 OnSelectCell事件处理...
  • 收集的stringgrid的技巧

    2006-06-10 19:49:00
    stringgrid 作者:jxp 日期:2005-12-30StringGrid行列增加和删除如何编写使StringGrid中的一列具有Check功能,和CheckBox效果一样StringGrid组件Cells内容分行显示在Tstringgrid.ondrawcell事件中在StringGrid怎样...

空空如也

空空如也

1 2 3 4 5
收藏数 96
精华内容 38
关键字:

如何增加行列