用sql 查询几个表的汇总.

boytomato 2003-10-16 06:32:22
比如查询几个表中一个字段值为'dd'所占比例,即各个表中数据项为'dd'相加/
几个表的计录相加.
如何实现.
...全文
42 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
hiflower 2003-10-17
  • 打赏
  • 举报
回复
这个应该可以了

SELECT CAST(A.CountDD AS FLOAT) / B.CountTotal AS Ratio
FROM (SELECT COUNT(*) AS CountDD
FROM (SELECT id, ddfield
FROM table1
UNION
SELECT id, ddfield
FROM table2) x
WHERE x.ddfield = 'dd') A CROSS JOIN
(SELECT COUNT(*) AS CountTotal
FROM (SELECT id, ddfield
FROM table1
UNION
SELECT id, ddfield
FROM table2) y) B
hthunter 2003-10-17
  • 打赏
  • 举报
回复
问题表达的不是很清楚,你的意思是不是要统计这几个表里面值为dd的记录的总数占这几个表的记录总数的百分比?
如果是这个意思的话,hiflower的语句的整体思路是对头的,但是忽略了一个问题:因为你只select了一个字段来Union,而Union的结果集中,所有相同的记录都会合并为一条记录,所以你的Count1最大只可能为1,因此Union的结果集需要有关键字,但是各个表的关键字可能数据类型不一样甚至关键字的字段数量都不一样,所以不好统一。
我也没有想到什么好方法,只想到两个笨方法。笨方法之一:把每个表的dd的count和总记录数先都统计出来用变量保存起来,然后再(dd_count 的总和) / (所有表记录数的总和)。
笨方法二:是笨方法一的延伸,使用临时表,实现如下:
create table #temp1(
[ID] [int] IDENTITY (1, 1) NOT NULL, --临时表的自增字段,保证插入记录时相同记录不会合并
[dd_Field] [varchar] (50) )

insert into #temp1(dd_Field)
select dd_Field
from table1

insert into #temp1(dd_Field)
select dd_Field
from table2

--有多少个表就在这里insert多少次

select
((select count(ID) from #temp1 where dd_Field = 'dd') / (select count(ID) from #temp1)) as Ratio

drop table #temp1
boytomato 2003-10-17
  • 打赏
  • 举报
回复
up
aiunong 2003-10-17
  • 打赏
  • 举报
回复
学习
UP
boytomato 2003-10-17
  • 打赏
  • 举报
回复
有sql 高手吗.
hthunter 2003-10-17
  • 打赏
  • 举报
回复
这个仍然不行,首先,两个表未必都有id字段,即使有定义完全一样的字段,那表示id值也可能重复,这时候id和dd_field都相同的字段又被合并了,出来的结果还是不正确的
hiflower 2003-10-16
  • 打赏
  • 举报
回复
SELECT (A.Count1/B.CountTotal) AS Ratio
FROM
(SELECT Count(*) AS Count1
FROM (SELECT ddfield FROM table1 UNION (SELECT ddfield FROM table2)) table
WHERE table.ddfield='dd') A,
(SELECT Count(*) CountTotal
FROM (SELECT ddfield FROM table1 UNION (SELECT ddfield FROM table2))) B



boytomato 2003-10-16
  • 打赏
  • 举报
回复
为什么没人呢...

5,386

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧