| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 897 人关注过本帖, 2 人收藏
标题:请教分别统计计算sql语句的用法
只看楼主 加入收藏
lasanding
Rank: 1
等 级:新手上路
帖 子:60
专家分:0
注 册:2011-11-3
结帖率:87.5%
收藏(2)
已结贴  问题点数:14 回复次数:14 
请教分别统计计算sql语句的用法
表1
       档次    户数
a    1号楼       20
b    2号楼       10
c    3号楼       30
a    4号楼       10
b    5号楼       30
c    6号楼       50
a    7号楼       10
b    8号楼       20
c    9号楼       30
合计                210
求:分别统计每个区的档次,每个区每个档次有多少户数?如表2
表2
  档次   档次合计 户数合计
a            2    30
a            1    10
a            0    0
b            1    30
b            2    30
b            0    0
c            0    0
c            1    50
c            2    60
合计               210


搜索更多相关主题的帖子: sql语句 统计 
2012-12-18 12:02
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9841
专家分:27213
注 册:2012-2-5
收藏
得分:5 
程序代码:
*---VFP9代码
*--- 第一步:先创建一个标准对照表
CREATE CURSOR T (区 C(1),档次 C(2),编号 N(1))
INSERT INTO T VALUES ([a],[],1)
INSERT INTO T VALUES ([a],[],2)
INSERT INTO T VALUES ([a],[],3)
INSERT INTO T VALUES ([b],[],4)
INSERT INTO T VALUES ([b],[],5)
INSERT INTO T VALUES ([b],[],6)
INSERT INTO T VALUES ([c],[],7)
INSERT INTO T VALUES ([c],[],8)
INSERT INTO T VALUES ([c],[],9)

*--- 第二步:生成一个临时数据表(可以省略,这里是示例)
CREATE CURSOR T0 (区 C(1),楼 C(10),档次 C(2),户数 N(3))
INSERT INTO T0 VALUES ([a],[1号楼],[],20)
INSERT INTO T0 VALUES ([b],[2号楼],[],10)
INSERT INTO T0 VALUES ([c],[3号楼],[],30)
INSERT INTO T0 VALUES ([a],[4号楼],[],10)
INSERT INTO T0 VALUES ([b],[5号楼],[],30)
INSERT INTO T0 VALUES ([c],[6号楼],[],50)
INSERT INTO T0 VALUES ([a],[7号楼],[],10)
INSERT INTO T0 VALUES ([b],[8号楼],[],20)
INSERT INTO T0 VALUES ([c],[9号楼],[],30)

*--- 第三步:生成SQL语句
SELECT 区,楼,档次,COUNT(*) 档次合计,SUM(户数) 户数 FROM T0 GROUP BY 区,楼,档次 INTO CURSOR T1
SELECT CAST(B.区 AS C(4)) AS 区,B.档次,NVL(SUM(A.档次合计),0) 档次合计,NVL(SUM(A.户数),0) 户数合计,B.编号 FROM T1 A FULL JOIN T B ON A.区==B.区 AND A.档次==B.档次 GROUP BY B.编号,B.区,B.档次 ORDER BY B.编号 INTO CURSOR T2 READWRITE
INSERT INTO T2 (区,档次合计,户数合计) SELECT  [合计],SUM(档次合计),SUM(户数合计) FROM T2
BROWSE
效果图
图片附件: 游客没有浏览图片的权限,请 登录注册

坚守VFP最后的阵地
2012-12-19 09:41
taifu945
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:80
帖 子:1545
专家分:3298
注 册:2012-7-6
收藏
得分:5 
以下是引用lasanding在2012-12-18 12:02:11的发言:

表1
       档次    户数
a    1号楼       20
b    2号楼       10
c    3号楼       30
a    4号楼       10
b    5号楼       30
c    6号楼       50
a    7号楼       10
b    8号楼       20
c    9号楼       30
合计                210
求:分别统计每个区的档次,每个区每个档次有多少户数?如表2
表2
  档次   档次合计 户数合计
a            2    30
a            1    10
a            0    0
b            1    30
b            2    30
b            0    0
c            0    0
c            1    50
c            2    60
合计               210
很简单的呀。假设源表为T1.DBF:
SELECT 区,档次,COUNT(档次) 档次合计,SUM(户数) 户数合计 FROM T1 GROUP BY 区,档次 ORDER BY 区 ASC, 档次 DESC


[ 本帖最后由 taifu945 于 2012-12-19 11:30 编辑 ]
2012-12-19 11:29
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9841
专家分:27213
注 册:2012-2-5
收藏
得分:0 
以下是引用taifu945在2012-12-19 11:29:42的发言:

很简单的呀。假设源表为T1.DBF:
SELECT 区,档次,COUNT(档次) 档次合计,SUM(户数) 户数合计 FROM T1 GROUP BY 区,档次 ORDER BY 区 ASC, 档次 DESC
表2
  档次   档次合计 户数合计
a            2    30
a            1    10
a            0    0
b            1    30
b            2    30
b            0    0
c            0    0
c            1    50
c            2    60
合计               210

不知这个代码能显示红字标示的结果吗

坚守VFP最后的阵地
2012-12-19 12:30
taifu945
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:80
帖 子:1545
专家分:3298
注 册:2012-7-6
收藏
得分:0 
以下是引用sdta在2012-12-19 12:30:44的发言:

表2
  档次   档次合计 户数合计
a            2    30
a            1    10
a            0    0
b            1    30
b            2    30
b            0    0
c            0    0
c            1    50
c            2    60
合计               210

不知这个代码能显示红字标示的结果吗
这倒真不能显示,若要显示得用另外的代码了,需要用表文件测试啦。但应该也可以一条语句搞定。
2012-12-19 13:39
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9841
专家分:27213
注 册:2012-2-5
收藏
得分:0 
回复 5楼 taifu945
是可以用一条语句搞定,但对以后的维护带来诸多不便。

坚守VFP最后的阵地
2012-12-19 14:24
taifu945
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:80
帖 子:1545
专家分:3298
注 册:2012-7-6
收藏
得分:0 
以下是引用sdta在2012-12-19 14:24:03的发言:

是可以用一条语句搞定,但对以后的维护带来诸多不便。

有结果啦:
SELECT 区,档次,COUNT(档次) 档次合计,SUM(户数) 户数合计 ;
   FROM T1 GROUP BY 区,档次 ;
UNION ALL ;
SELECT 区,档次,0,0 ;
   FROM (SELECT * FROM (SELECT DISTINCT 区 FROM T1) T2_1 ;
      JOIN (SELECT DISTINCT 档次 FROM T1) T2_2 ON .T.) T3 ;
   WHERE 区+档次 NOT IN (SELECT 区+档次 FROM T1) ;
   ORDER BY 区 ASC, 档次 DESC

维护应该没有问题。象这种嵌套的复杂查询可以做个辅助文档,或直接在程序里用注释语句的形式,把这条语句拆分成各部分详解。一个好的软件本来就需要维护文档和大量注释语句的,不是吗?比如本例,文档中就可以这么写:

* 各已有档次的结果
SELECT 区,档次,COUNT(档次) 档次合计,SUM(户数) 户数合计 ;
   FROM T1 GROUP BY 区,档次


* 组合区和档次
SELECT * FROM (SELECT DISTINCT 区 FROM T1) T2_1 ;
   JOIN (SELECT DISTINCT 档次 FROM T1) T2_2 ON .T.


* 找出源表中不存在的档次
SELECT 区,档次,0,0 ;
   FROM (SELECT * FROM (SELECT DISTINCT 区 FROM T1) T2_1 ;
      JOIN (SELECT DISTINCT 档次 FROM T1) T2_2 ON .T.) T3 ;
   WHERE 区+档次 NOT IN (SELECT 区+档次 FROM T1)


* 最后的结果
SELECT 区,档次,COUNT(档次) 档次合计,SUM(户数) 户数合计 ;
   FROM T1 GROUP BY 区,档次
;
UNION ALL ;
SELECT 区,档次,0,0 ;
   FROM (
SELECT * FROM (SELECT DISTINCT 区 FROM T1) T2_1 ;
      JOIN (SELECT DISTINCT 档次 FROM T1) T2_2 ON .T.
) T3 ;
   WHERE 区+档次 NOT IN (SELECT 区+档次 FROM T1)
;
   ORDER BY 区 ASC, 档次 DESC

这来一写,将来维护不就简单了吗?程序语句再复杂也不要紧,要命的是没有养成良好的编程习惯,例如:注释文档和格式化代码。我认为这两种习惯很重要,尤其对于将来的维护来说。


[ 本帖最后由 taifu945 于 2012-12-19 15:22 编辑 ]
2012-12-19 14:41
lasanding
Rank: 1
等 级:新手上路
帖 子:60
专家分:0
注 册:2011-11-3
收藏
得分:0 
如果表1改成表3后,如何才能不重复计算档次、户数?
表3
       档次    户数
a    1号楼       20
b    2号楼       10
c    3号楼       30
a    1号楼       20
b    2号楼       10
c    3号楼       30
2012-12-19 15:53
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9841
专家分:27213
注 册:2012-2-5
收藏
得分:0 
回复 8楼 lasanding
SELECT ALL  DISTINCT ........

坚守VFP最后的阵地
2012-12-19 16:20
taifu945
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:80
帖 子:1545
专家分:3298
注 册:2012-7-6
收藏
得分:0 
以下是引用lasanding在2012-12-19 15:53:48的发言:

如果表1改成表3后,如何才能不重复计算档次、户数?
表3
       档次    户数
a    1号楼       20
b    2号楼       10
c    3号楼       30
a    1号楼       20
b    2号楼       10
c    3号楼       30

不知道你所说的不重复是指啥?“GROUP BY 区,档次”子句已经可以保证输出结果不重复了呀。你可以用表3的数据试试。
2012-12-19 17:11
快速回复:请教分别统计计算sql语句的用法
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.037864 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved