| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1258 人关注过本帖, 2 人收藏
标题:请教:这个带统计的查询如何设计啊
只看楼主 加入收藏
寻H不得
Rank: 4
等 级:业余侠客
威 望:1
帖 子:181
专家分:222
注 册:2010-10-9
结帖率:100%
收藏(2)
已结贴  问题点数:20 回复次数:16 
请教:这个带统计的查询如何设计啊
近来做统计时遇到这个问题,虽然已经解决,但总是不满意过程
请教各位高手有没有更简单的查询语句??
这是电子表:
单位      货物类别   到货时间        
东山村    南瓜    20110701
西山村    冬瓜    20110701
南山村    西瓜    20110701
北山村    木瓜    20110702
李家村    丝瓜    20110702
王家村    南瓜    20110702
南山村    冬瓜    20110702
北山村    西瓜    20110702
李家村    木瓜    20110702
南山村    丝瓜    20110702
北山村    香瓜    20110703
李家村    哈蜜瓜    20110703
王家村    南瓜    20110703
南山村    冬瓜    20110703
北山村    西瓜    20110703
李家村    蚕豆    20110703
南山村    大豆    20110703
  .        .       .
  .        .       .

想通过统计得到如下效果:(纵向统计不重复的单位,横向统计各单位进该货物次数,问题是单位和货物都有好几十类)
单位    南瓜  冬瓜  西瓜 木瓜    ...瓜
东山村    3    1     0     1     ...1   
西山村    0    1     1     0     ... 1  
南山村    1    1     1    1      ... 2
北山村    2    5     2    0      ... 2
 .        .    .     .    .      ....               
 .        .    .     .    .      ....               

得到这个第一列好办,甚至就是个三五列也好办,问题是有多少列都不能固定。
所以我的思路第一步先读入电子表到VFP表,得到第一列内容和总列数(sele dist 货物类别,count(*) as ci from 表 group by  货物类别),有这一步才能确定有多少列
第二步采用循环,使用count 命令
count for 单位=“东山村”  and 货物=“南瓜” to x
repl ()  with x
这个思路结果到是做得出来 但是总觉得不爽,总觉得没用好分组统计,
是不是思路上出了问题,脑袋不够用了?还是近来太热了 ??
本来在电子表里用函数就可以直接统计出来,但每次新到电子表时这行又可能不同,还是要重来设置函数,用起来也不舒服
请教各位老大 有没有更好的思路??

[ 本帖最后由 寻H不得 于 2011-7-29 00:01 编辑 ]
搜索更多相关主题的帖子: 统计 木瓜 北山村 东山村 哈蜜瓜 
2011-07-28 23:52
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:7 
哈哈~

授人以渔,不授人以鱼。
2011-07-28 23:57
寻H不得
Rank: 4
等 级:业余侠客
威 望:1
帖 子:181
专家分:222
注 册:2010-10-9
收藏
得分:0 
这个~什么意思??
2011-07-29 00:02
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
以下是引用寻H不得在2011-7-29 00:02:44的发言:

这个~什么意思??


兔斯基表情07,論壇現在不能顯示表情了,不知道搞什麽鬼。

授人以渔,不授人以鱼。
2011-07-29 00:08
茵梦湖
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:31
帖 子:545
专家分:2180
注 册:2009-4-25
收藏
得分:7 
2011-07-29 00:30
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
程序代码:
CLEAR ALL 
CLEAR 
SET SAFETY OFF 
USE in_data IN 0
my_Count("in_data", "單位", "貨物類別", "out_data")
USE IN in_data
RETURN 

*-----------------------------------------
* 目標:對輸入表進行計數統計,將結果輸出到自由表中
* 參數:tcInTable  -- 數據來源的輸入表別名
*       tcRowField -- 統計單位,是輸入表的一個字段名,將作爲輸出表的行名稱
*       tcColField -- 統計對象,是輸入表的一個字段名,將作爲輸出表的列名稱
*       tcOutTable -- 輸出的自由表名,新生成,將覆蓋磁盤上已有的同名文件
* 機制:將統計數據生成在内存二維數組中,然後將此數組的内容輸出到指定表。
* 用法:見本程序示例
*-----------------------------------------
PROCEDURE my_Count(tcInTable AS Character, tcRowField AS Character, tcColField AS Character, tcOutTable AS Character)
    LOCAL lcField AS Character, lnRecord AS Integer 
    LOCAL laTable[1,1]
    LOCAL lnRow AS Integer, lnCol AS Integer 
    LOCAL lcString AS Character 
    
    * 獲取行標題和列標題
    lcField = tcInTable + "." + tcRowField
    SELECT DISTINCT &lcField AS R1 FROM (tcInTable) INTO CURSOR cursor_Rows
    lcField = tcInTable + "." + tcColField
    SELECT DISTINCT &lcField AS C1 FROM (tcInTable) INTO CURSOR cursor_Cols
    
    * 將統計結果儲存到二維數組中
    DIMENSION laTable[RECCOUNT("cursor_Rows"), RECCOUNT("cursor_Cols")]
    STORE 0 TO laTable
    lnRecord = RECNO(tcInTable)
    GOTO TOP IN (tcInTable)
    DO WHILE !EOF(tcInTable)
        SELECT cursor_Rows
        LOCATE FOR UPPER(ALLTRIM(cursor_Rows.R1)) == UPPER(ALLTRIM(EVALUATE(tcInTable + "." + tcRowField)))
        lnRow = RECNO("cursor_Rows")
        SELECT cursor_Cols
        LOCATE FOR UPPER(ALLTRIM(cursor_Cols.C1)) == UPPER(ALLTRIM(EVALUATE(tcInTable + "." + tcColField)))
        lnCol = RECNO("cursor_Cols")
        laTable[lnRow, lnCol] = laTable[lnRow, lnCol] + 1
        SKIP IN (tcInTable)
    ENDDO 
    GOTO lnRecord IN (tcInTable)
    
    * 創建輸出表結構,lcString 為 CREATE TABLE 命令字段結構格式字符串
    lcString = "( " + tcRowField + " C( " + ALLTRIM(STR(LEN(EVALUATE(tcInTable + "." + tcRowField)))) + "), "
    SELECT cursor_Cols
    SCAN ALL 
        lcString = lcString + ALLTRIM(cursor_Cols.C1) + " I, "
    ENDSCAN 
    lcString = LEFT(lcString, LEN(lcString) - 2) + " )"
    
    * 創建輸出表
    IF USED(tcOutTable)
        USE IN (tcOutTable)
    ENDIF 
    CREATE TABLE (tcOutTable) FREE &lcString
    FOR lnRow = 1 TO ALEN(laTable,1)
        GOTO lnRow IN cursor_Rows
        SELECT (tcOutTable)
        APPEND BLANK 
        REPLACE (FIELD(1, tcOutTable)) WITH cursor_Rows.R1
        FOR lnCol = 1 TO ALEN(laTable,2)
            REPLACE (FIELD(lnCol + 1, tcOutTable)) WITH laTable[lnRow, lnCol]
        NEXT 
    NEXT 
    
    * 關閉本過程打開的臨時文件
    USE IN (tcOutTable)
    USE IN cursor_Rows
    USE IN cursor_Cols
    
ENDPROC


輸入表in_data.dbf的内容:
图片附件: 游客没有浏览图片的权限,请 登录注册


輸出表out_data.dbf的結果:
图片附件: 游客没有浏览图片的权限,请 登录注册


[ 本帖最后由 TonyDeng 于 2011-7-29 02:15 编辑 ]

授人以渔,不授人以鱼。
2011-07-29 01:50
qingfameng
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:35
帖 子:964
专家分:3019
注 册:2010-2-6
收藏
得分:7 
本段是否能参考?你的原始表被称为‘瓜表’。字段名是:单位,货物类别,到货时间.保持了原结构。
 
close all
select 货物类别 from 瓜表 into cursor b1 group by 货物类别
sele b1
count to n
cdh=","

c1='create cursor b2 (单位 c(30),'
scan
  if recno()=n
     cdh=') '
  endif
  c1=c1+alltrim(货物类别)+" i"+cdh
ends
  &c1
  
  sele 瓜表
  go top
  do while.not.eof()
     cdw=alltrim(单位)
     ncs=货物类别
     sele b2
     locat for alltrim(单位)==cdw
     if found()
        replace &ncs with (&ncs+1)
     else
        append blank
        replace 单位 with cdw,&ncs with 1
     endif
     sele 瓜表
     skip
 enddo
 
  sele b2
  brow
  


[ 本帖最后由 qingfameng 于 2011-7-29 10:47 编辑 ]
2011-07-29 10:43
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
6樓的例程,是通用的,裏面沒有使用特殊的表名、字段名,相同類型的需求,直接調用這個過程就可以了。而且,裏面統計的部分,稍作改動,就可以用於求和、求差等等,絕大部分代碼都不需要變動(其實甚至可以把統計法則也從外部傳入,則是完全通用的)。

授人以渔,不授人以鱼。
2011-07-29 15:04
寻H不得
Rank: 4
等 级:业余侠客
威 望:1
帖 子:181
专家分:222
注 册:2010-10-9
收藏
得分:0 
TonyDeng先生确实很专业
就是感觉太专业了 读起来有点绕
今天抽时间想了想
我再用 sele sum(iif()) as 种类1,sum(iif()) as 种类2,... where . group by .   语句实验成功,而且速度快
  sele dist 种类,count(*) as 次 from sjb group by 种类 order by 次 desc into curs _ls
    cxj='sele dist 单位 as 单位'
      do while.not.eof()
        cxj=cxj+',sum(iif("'+allt(_ls.种类)+'",1,0)) as '++_ls.种类
         skip
      enddo
    cxj=cxj+' from sjb group by '...
   &cxj
其关键就是构建查询语句,在此非常感谢各位的热心帮助,你们构建表的设计给了我很大的提示
再次感谢!


[ 本帖最后由 寻H不得 于 2011-7-29 17:04 编辑 ]
2011-07-29 17:03
hdlxdl
Rank: 1
等 级:新手上路
帖 子:12
专家分:1
注 册:2011-6-13
收藏
得分:0 
请教:对于没有固定列数的统计结果,该如何制作打印报表
2011-07-31 15:13
快速回复:请教:这个带统计的查询如何设计啊
数据加载中...
 
   



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

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