求关于分类查询统计的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 行受影响)
*/