2013年11月4日星期一

分组求和,将一列的数据求和 - jayxhj

本邮件内容由第三方提供,如果您不想继续收到该邮件,可 点此退订
分组求和,将一列的数据求和 - jayxhj  阅读原文»

在数据库操作中常常会将某一列的具有相似性质的数据进行求和,昨天在做的项目中遇到了。
后来请教了一下自己又摸索了一下,得出了解决方案,那就是<strong>分组求和</strong>。
需求:将某列数据求和
例子:

数据库内容为:

根据record_type进行分组再求和,也就是将1、2、3三种类型进行分组,所以结果预期为三行

再一种是根据record_date来分组,由于日期有两组,故预期分组也为两组,结果为同一日期的c、d列数据相加

总结:当需要进行对某一列的具有相似条件(对应于where中的条件)的数据进行合并时,使用group by将记录分组,再使用聚合函数对数据进行需要的操作。这样就可以使用一条语句将所有的数据进行分组求和。

创建例子中的数据的SQL语句为

1 CREATE DATABASE /*!32312 IF NOT EXISTS*/`group` /*!40100 DEFAULT CHARACTER SET utf8 */;
2
3 USE `group`;
4
5 /*Table structure for table `test` */
6
7 DROP TABLE IF EXISTS `test`;
8
9 CREATE TABLE `test` (
10 `id` int(10) NOT NULL AUTO_INCREMENT,
11 `record_date` date DEFAULT NULL,
12 `record_type` int(10) DEFAULT NULL,
13 `c` int(10) DEFAULT NULL,
14 `d` int(10) DEFAULT NULL,
15 PRIMARY KEY (`id`)
16 ) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8;
17
18 /*Data for the table `test` */
19
20 insert into `test`(`id`,`record_date`,`record_type`,`c`,`d`) values (1,'2013-10-14',1,1000,10000),(2,'2013-10-15',1,2000,20000),(3,'2013-10-14',2,3000,30000),(4,'2013-10-15',2,4000,40000),(5,'2013-10-14',3,5000,50000);

查询语句为

SELECT SUM(c) 'c列数据的和',SUM(d)'d列数据的和'
FROM test
WHERE record_date BETWEEN '2013-10-13' AND '2013-10-16'
GROUP BY record_type
ORDER BY record_type ASC


本文链接:http://www.cnblogs.com/jayxhj/p/3408018.html,转载请注明。

C++算法编程题(四)上三角 - 田园里的蟋蟀  阅读原文»

前言

  上一篇《C++算法编程题(三)画表格

  上几篇说的都是根据要求输出一些字符、图案等,今天就再说一个“上三角”,有点类似于第二篇说的正螺旋,输出的字符少了,但是逻辑稍微复杂了点。

程序描述

  方阵的主对角线之上称为“上三角”。
请你设计一个用于填充n阶方阵的上三角区域的程序。填充的规则是:使用1,2,3….的自然数列,从左上角开始,按照顺时针方向螺旋填充。
例如:当n=3时,输出:
1 2 3
6 4
5
当n=4时,输出:
1 2 3 4
9 10 5
8 6
7
当n=5时,输出:
1 2 3 4 5
12 13 14 6
11 15 7
10 8
9

程序运行时,要求用户输入整数n(3~20)
程序输出:方阵的上三角部分。
要求格式:每个数据宽度为4,右对齐。

程序实现

  上三角和正螺旋的图形很相似,不同的是上三角输出的图形是从对角线斜过来的。

  接下来,我们看看能不能从上三角图形中找些规律,有规律、把思路理清了,我们才能更容易用程序来实现所需功能。

  首先我们会发现,输出的上三角和我们输入的行有关,如果输入5行,那就15个数,也就是输入N行,就输出N*(N+1)/2个数;其次和正螺旋一样都是依次递增的,从上三角图形我们可以看到,递增分为三个方向;左->右、右上->左下、下->上。

  先贴下代码:

1 for(j=1;j<=N*(N+1)/2;low++,hi--)
2 {
3 for(i=low;i<hi-low;i++)
4 a[low]=j++;
5 for(i=low+1;i<hi-low;i++)
6 a[hi-i-1]=j++;
7 for(i=(hi-low)-2;i>low;i--)
8 a[low]=j++;
9 }

  a表示的是输出的二维数组,N表示输入的行数,hi表示的是列的个数,初始化和N一样,N*(N+1)/2表示的就是上三角的个数,low表示的圈数,这三个for循环的意思就是上面说的三个方向,语句很简单主要是怎么利用参数来表示输出数组的下标。

  话不言多,大家慢慢体会,如果有更好的实现方法,欢迎交流。。。

  完整代码:

1 #include "stdio.h"
2 #include "string.h"
3 #include "stdlib.h"
4
5 int main()
6 {
7 int low,i,j,hi,N;
8 int a[80][80];
9 while(scanf("%d",&N))
10 {
11 if(N==0)
12 break;
13 low=0;
14 hi=N;
15 for(j=1;j<=N*(N+1)/2;low++,hi--)
16 {
17 for(i=low;i<hi-low;i++)
18 a[low]=j++;
19 for(i=low+1;i<hi-low;i++)
20 a[hi-i-1]=j++;
21 for(i=(hi-low)-2;i>low;i--)
22 a[low]=j++;
23 }
24 for(i=0;i<N;i++)
25 {
26 for(j=0;j<N-i;j++)
27 printf("%4d ",a[j]);
28 printf("\n");
29 }
30 }
31 return 0;
32 }

  运行结果:

没有评论:

发表评论