SQL 分类汇总问题!高手进 在线等。。。(200分)

  • 主题发起人 主题发起人 qpmz99
  • 开始时间 开始时间
Q

qpmz99

Unregistered / Unconfirmed
GUEST, unregistred user!
现有一条SQL语句:select Country,ArrivalVariance,count(ArrivalVariance) as amount from export group by Country,ArrivalVariance
其中ArrivalVariance为天数
运行结果如下:
Country ArrivalVariance amount
china 0 6
china 1 3
china 2 1
USA 0 10
USA 1 2
USA 2 3
USA 3 5

要求:如何改动上面的SQL 才能实现如下形式
Country ArrivalVariance amount
china 0 6
china 1 3
china 2 1
合计 10
USA 0 10
USA 1 2
USA 2 3
USA 3 5
合计 20

如果SQL不能实现 请教用程序如何实现?
 
假设你把前一条SQL语句建立为一个视图,名为V_ARRIVAL,后面的分类汇总结果可以由
select Country, sum(amount) as Amount from V_ARRIVAL group by Country
得到,然后可以用一个报表生成工具来完成,比如说最基本的QuickReport控件都行,设置不同组别的Band,分类明细的由一个TQuery/TADOQuery查询取得,分类汇总由另一个TQuery/TADOQuery查询取得,分别关联QuickReport的不同Band。

如果用纯SQL的方式实现,可以建立一个临时表来存统计记录,然后用两句语句来插入统计结果,一句是你写的那句,一句是我写的这句。当然,这样需要为临时表设计一个辅助字段用来排序……
 
SQL SERVER 中:
COMPUTE 子句
生成合计作为附加的汇总列出现在结果集的最后。当与 BY 一起使用时,COMPUTE 子句在结果集内生成控制中断和分类汇总。可在同一查询内指定 COMPUTE BY 和 COMPUTE。


select Country,ArrivalVariance,count(ArrivalVariance) as amount from export COMPUTE BY Country,ArrivalVariance


oracle 可以用分析函数处理得到
 
用cxGrid实现非常简单,显示组注脚后,按Country进行分组即可。
 
SELECT
CASE
WHEN (Grouping(Country)=1) THEN '合计'
ELSE Country
END AS Country,

CASE
WHEN (Grouping(ArrivalVariance)=1) THEN '小计'
ELSE ArrivalVariance
END AS ArrivalVariance,

Count(ArrivalVariance) as amount

FROM export GROUP BY Country, ArrivalVariance WITH ROLLUP
 
这种结果在报表中可以实现,还就是像楼上说的在查询分析器中通过COMPUTE子句可以实现,可如果放在程序中去显示的话,恐怕就不好处理了
 
在group by 后面加上 with rollup
你看看结果是不是你想要的
 
如果是oracle的话可以用下面的语句
select Country, ArrivalVariance, count(ArrivalVariance) as amount
from export
group by GROUPING SETS((Country, ArrivalVariance),(Country))
 
procedure TForm1.AddSum;
var
sCountry: string;
iStartNo, iEndNO: Integer;
dSum, dTotal: Double;
begin
sCountry := '';
iStartNo := 1;
iEndNo := 0;
dSum := 0;
sTotal := 0;
sql := 'select Country,ArrivalVariance,count(ArrivalVariance) as amount from export group by Country,ArrivalVariance';
cds_Query.CommandText := SQL;// 创建一个clientDataset 数据集 ;
cds_Query.First;
while cds_Query.Eof then
begin
dTotal := dTotal + cds_Query.FieldByName('Amount').AsFloat;
if sCountry <> cds_Query.FieldByName('Country').AsString then
begin
iEndNo := cds_Query.RecNo;
if (iStartNo < iEndNo) then
begin
cds_Query.Insert;
cds_Query.FieldByName('country').AsString := '合计';
cds_Query.FieldByName('Amount').AsFloat := dSum;
cds_Query.Post;
cds_Query.Next;
iStartNo := cds.RecNo;
dSum := 0;
end;
end;
dSum := dSum + cds_Query.FieldByName('Amount').AsFloat;
cds_Query.Next;
end;
end;
调用下应该可以的~ 试试~
 
后退
顶部