日期:2014-05-18  浏览次数:20483 次

求关于分类查询统计的Sql语句
再做一个物流系统,客户要求单据查询按照目的地分类查询统计出来:
单据表如下:bill
  字段: 单号 发货人 收货人 目的地 件数 运费
  1 A B 北京 1 50
  2 C D 广州 1 100
  3 E F 上海 1 20
  4 G H 北京 2 50


客户要求按照目的地查询出如下效果的表格:
  北京
  单号 发货人 收货人 目的地 件数 运费
  1 A B 北京 1 50
  4 G H 北京 2 50
  合计: 3 100
  广州
  单号 发货人 收货人 目的地 件数 运费
  2 C D 广州 1 100
  合计: 1 100
  上海
  单号 发货人 收货人 目的地 件数 运费
  3 E F 上海 1 20
  合计: 1 20

原来我设计的是先查询目的地,按后按照目的地再查询单据,然后再查询单据的合计值,但该系统是B/s结构纯网页模式,没有分页,而且数据量再10万条左右,查询起来非常慢,请大虾指点下如何能够快速查询出这种结构的数据表!


   
   
   
 

------解决方案--------------------
SELECT NUM=1,FHR='A',SHR='B',ADDR='北京',AMOUNT=1,FEE=50
INTO #BILL
UNION
SELECT NUM=2,FHR='C',SHR='D',ADDR='广州',AMOUNT=1,FEE=100
UNION
SELECT NUM=3,FHR='E',SHR='F',ADDR='上海',AMOUNT=1,FEE=20
UNION
SELECT NUM=4,FHR='G',SHR='H',ADDR='北京',AMOUNT=2,FEE=50

SELECT NUM,FHR,SHR,ADDR=(CASE IFSUM WHEN 1 THEN '合计' ELSE ADDR END),AMOUNT,FEE

FROM 
(
SELECT *,IFSUM=0 FROM #BILL
UNION ALL
SELECT NULL,NULL,NULL,ADDR,SUM(AMOUNT),SUM(FEE),IFSUM=1
FROM #BILL 
GROUP BY ADDR
) X 
ORDER BY X.ADDR ASC,X.NUM DESC

/*
NUM FHR SHR ADDR AMOUNT FEE
4 G H 北京 2 50
1 A B 北京 1 50
NULL NULL NULL 合计 3 100
2 C D 广州 1 100
NULL NULL NULL 合计 1 100
3 E F 上海 1 20
NULL NULL NULL 合计 1 20
*/
数据库里我能做到的只有这样了,不知道能否帮到你
------解决方案--------------------
SQL code
create table bill(单号 int,发货人 varchar(1), 收货人 varchar(1),目的地 varchar(6),件数 int, 运费 int)

insert bill
select  1 ,'A','B','北京', 1 ,50 union all
select  2 ,'C','D','广州', 1 ,100 union all
select  3 ,'E','F','上海', 1 ,20 union all
select  4 ,'G','H','北京', 2 ,50


with cte as 
(
    select 单号,发货人,收货人,目的地,件数,运费 from bill --where 日期 between 日期A and 日期B
)

select case when 发货人 is null then null else 单号1 end as 单号,发货人,收货人,
 case when 发货人 is null then '合计' else 目的地1 end as 目的地,件数,运费 
from 
(select 单号 as 单号1,发货人,收货人,目的地 as 目的地1,件数,运费 from cte
union all
select max(单号)+1,null,null,目的地,sum(件数)件数,sum(运费)运费 from cte group by 目的地) tb
order by 目的地1,单号1

/*
单号          发货人  收货人  目的地    件数          运费
----------- ---- ---- ------ ----------- -----------
1           A    B    北京     1           50
4           G    H    北京     2           50
NULL        NULL NULL 合计     3           100
2           C    D    广州     1           100
NULL        NULL NULL 合计     1           100
3           E    F    上海     1           20
NULL        NULL NULL 合计     1           20

(7 行受影响)
*/