十万火急,如何用SQL完成统计功能(100分)

  • 主题发起人 主题发起人 lkpc
  • 开始时间 开始时间
L

lkpc

Unregistered / Unconfirmed
GUEST, unregistred user!
如下是原数据表(简化)
名称 发病性别

高血压 女
冠心病 男
高血压 男
心血管病 男
冠心病 男

统计为如下表:

名称 总记录数 男记录数 女记录数
高血压 2 1 1
冠心病 2 2 0
心血管病 1 1 0

SOS!!!
 
如果你是用 Access ,也许我能帮助你!
Log 是表名,Name 是病名,Sex 是性别,ID 是表的 Primary Index 。

TRANSFORM Count(Log.ID) AS ID之Count
SELECT Log.Name, Count(Log.ID) AS [总计]
FROM Log
GROUP BY Log.Name
PIVOT Log.Sex;

这样的查询称之为 Cross Table ,PB 也支持类似的功能,但是 SQL Server 好像不行!
Good luck !
 
先用select count(名称),count(发病性别) group by 名称,发病性别
order by 名称,发病性别 查出数据然后依次读到一个临时表里或内存数组中。
 
i think it should like this? //never tested
select 名称 count(a.性别),count(b.性别)
from yourTable a outer join yourTable b on
a.名称 = b.名称
group by a.名称
 
呵呵,CJ is right.
 
我这样试着做了一下,但出现提示“ from子句错误”,why? 我对SQL没有
深入研究,希望大家再提示一下。其中ee 是数据表名称,e4是疾病名称,e12是性别
希望CJ先生看看语句中是否有错误。(我用的是ACCESS库)
with Query1 do
begin
close;
SQL.clear;
SQL.add('select e4,count(a.e12),count(b.e12)');
SQL.add('from ee a outer join ee b on a.e12= b.e12');
SQL.add(' group by a.e12');
prepare;
open;
end;
 
to CJ:
what means a,b?
 
To CJ: 你的办法有问题啦! :-(
Join 条件不对,应该用 Primary Index 字段做连接,否则会出现“乘积”式的结果。
比如有两个“高血压”,自己和自己一连接,就出现 2 X 2 = 4 条结果了。
To lkpc: CJ 的办法是“同表多名”的意思,在关系数据库理论中应该叫“元组变量”,
为同一个 Table 取两个别名 A 、B 。改一下连接条件就正确了。

Select A.名称 Count(A.性别),Count(B.性别) // 应该指明 Select A.名称,否则会报错,因为 B 也有名称
From YourTable A Full Outer Join YourTable B On
A.ID = B.ID // 用 Primary Index 字段连接
Group By A.名称
 
a,b is your datasheet's symbol
 
如果你用的是sql server7:
我用了一个很复杂的方法,很管用,可总觉得有不足之处。例如速度等。请高手指正。
table:
t1 t2
高血压 女
冠心病 男
高血压 男
心血管病 男
冠心病 男
sql:
select t1.t1,t1.总记录数,isnull(t2.男记录数,0) as 男记录数,isnull(t3.女记录数,0) as 女记录数 from ((select t1,count(*) as 总记录数 from test group by t1) as t1 left join (select t1,count(*) as 男记录数 from test where t2='男' group by t1) as t2 on t1.t1=t2.t1) left join (select t1,count(*) as 女记录数 from test where t2='女' group by t1) as t3 on t1.t1=t3.t1

result:
t1 总记录数 男记录数 女记录数
-------------------------------------------------- ----------- ----------- -----------
高血压 4 3 1
冠心病 2 2 0
心血管病 1 1 0

(3 row(s) affected)
 
有问题请联系,可以再讨论。
 
to sportsman: 我用的是ACCESS,你的代码中的(*在delphi会被认为
是注释,所以无法调试!
to:Bakubaku经您修改后的CJ的代码仍然在运行中出现SQL语法错误!
用两到三个SQL语句实现也行,只要有办法,我不想用TABLE去逐个查询。
 
to lkpc: 你得加个引号啊
 
To lkpc: 如果你用的是 Access ,我第一次的答案就可以啊。:-(
 
小弟问一句怎样给同一张表取两个名字能详细的介绍一下吗?
 
to BakuBaku,我试过您的语句, 您的语句中的 TRANSFORM, delphi根本不认识呀?
to Crab: 在那里加引号?
 
lkpc:如果你还要继续讨论请定期提前你的帖子,如果不想继续讨论请结束帖子。
 
多人接受答案了。
 
后退
顶部