查2004年4月:SELECT A.企业性质,A.进出口本期 AS 进出口本期,B.进出口本期 AS 进出口去年同期,(A.进出口本期-B.进出口本期)/B.进出口本期 AS 同比,A.进口本期,B.进口本期 AS 进口去年同期,(A.进口本期-B.进口本期)/B.进口本期 AS 同比,A.出口本期,B.出口本期 AS 出口去年同期,(A.出口本期-B.出口本期)/B.出口本期 AS 同比
FROM (SELECT 企业性质,SUM(数量) AS 进出口本期,SUM(CASE WHEN 进出口标记='进口' THEN 数量 ELSE 0 END) AS 进口本期,SUM(CASE WHEN 进出口标记='出口' THEN 数量 ELSE 0 END) AS 出口本期 FROM 数据表 WHERE 年=2004 AND 月=4 GROUP BY 企业性质
UNION ALL
SELECT '合计' AS 企业性质,SUM(数量) AS 进出口本期,SUM(CASE WHEN 进出口标记='进口' THEN 数量 ELSE 0 END) AS 进口本期,SUM(CASE WHEN 进出口标记='出口' THEN 数量 ELSE 0 END) AS 出口本期 FROM 数据表 WHERE 年=2004 AND 月=4
) AS A,
(SELECT 企业性质,SUM(数量) AS 进出口本期,SUM(CASE WHEN 进出口标记='进口' THEN 数量 ELSE 0 END) AS 进口本期,SUM(CASE WHEN 进出口标记='出口' THEN 数量 ELSE 0 END) AS 出口本期 FROM 数据表 WHERE 年=2004-1 AND 月=4 GROUP BY 企业性质
UNION ALL
SELECT '合计' AS 企业性质,SUM(数量) AS 进出口本期,SUM(CASE WHEN 进出口标记='进口' THEN 数量 ELSE 0 END) AS 进口本期,SUM(CASE WHEN 进出口标记='出口' THEN 数量 ELSE 0 END) AS 出口本期 FROM 数据表 WHERE 年=2004-1 AND 月=4
) AS B
WHERE A.企业性质=B.企业性质
FROM (SELECT 企业性质,SUM(数量) AS 进出口本期,SUM(CASE WHEN 进出口标记='进口' THEN 数量 ELSE 0 END) AS 进口本期,SUM(CASE WHEN 进出口标记='出口' THEN 数量 ELSE 0 END) AS 出口本期 FROM 数据表 WHERE 年=2004 AND 月=4 GROUP BY 企业性质
UNION ALL
SELECT '合计' AS 企业性质,SUM(数量) AS 进出口本期,SUM(CASE WHEN 进出口标记='进口' THEN 数量 ELSE 0 END) AS 进口本期,SUM(CASE WHEN 进出口标记='出口' THEN 数量 ELSE 0 END) AS 出口本期 FROM 数据表 WHERE 年=2004 AND 月=4
) AS A,
(SELECT 企业性质,SUM(数量) AS 进出口本期,SUM(CASE WHEN 进出口标记='进口' THEN 数量 ELSE 0 END) AS 进口本期,SUM(CASE WHEN 进出口标记='出口' THEN 数量 ELSE 0 END) AS 出口本期 FROM 数据表 WHERE 年=2004-1 AND 月=4 GROUP BY 企业性质
UNION ALL
SELECT '合计' AS 企业性质,SUM(数量) AS 进出口本期,SUM(CASE WHEN 进出口标记='进口' THEN 数量 ELSE 0 END) AS 进口本期,SUM(CASE WHEN 进出口标记='出口' THEN 数量 ELSE 0 END) AS 出口本期 FROM 数据表 WHERE 年=2004-1 AND 月=4
) AS B
WHERE A.企业性质=B.企业性质
(A.进出口本期-B.进出口本期)/B.进出口本期 AS 同比,
A.进口本期,B.进口本期 AS 进口去年同期,
(A.进口本期-B.进口本期)/B.进口本期 AS 同比,
A.出口本期,B.出口本期 AS 出口去年同期,
(A.出口本期-B.出口本期)/B.出口本期 AS 同比
FROM (
SELECT 企业性质,SUM(数量) AS 进出口本期,
SUM(CASE WHEN 进出口标记='进口' THEN 数量 ELSE 0 END) AS 进口本期,
SUM(CASE WHEN 进出口标记='出口' THEN 数量 ELSE 0 END) AS 出口本期
FROM 数据表 WHERE 年=2004 AND 月=4 GROUP BY 企业性质
UNION ALL
SELECT '合计' AS 企业性质,SUM(数量) AS 进出口本期,
SUM(CASE WHEN 进出口标记='进口' THEN 数量 ELSE 0 END) AS 进口本期,
SUM(CASE WHEN 进出口标记='出口' THEN 数量 ELSE 0 END) AS 出口本期
FROM 数据表 WHERE 年=2004 AND 月=4
) AS A,
(
SELECT 企业性质,SUM(数量) AS 进出口本期,
SUM(CASE WHEN 进出口标记='进口' THEN 数量 ELSE 0 END) AS 进口本期,
SUM(CASE WHEN 进出口标记='出口' THEN 数量 ELSE 0 END) AS 出口本期
FROM 数据表 WHERE 年=2004-1 AND 月=4 GROUP BY 企业性质
UNION ALL
SELECT '合计' AS 企业性质,SUM(数量) AS 进出口本期,
SUM(CASE WHEN 进出口标记='进口' THEN 数量 ELSE 0 END) AS 进口本期,
SUM(CASE WHEN 进出口标记='出口' THEN 数量 ELSE 0 END) AS 出口本期
FROM 数据表 WHERE 年=2004-1 AND 月=4
) AS B
WHERE A.企业性质=B.企业性质
select @year=2004,@month=3 --定义要查询的年月--查询
select 企业性质=isnull(a.企业性质,b.企业性质)
,进出口本期=isnull(a.进出口本期,0)
,进出口去年同期=isnull(b.进出口本期,0)
,进出口同比=cast(cast(isnull(a.进出口本期,0)*100.0
/isnull(b.进出口本期,0) as decimal(20,2)) as varchar)+'%'
,进口本期=isnull(a.进口本期,0)
,进口去年同期=isnull(b.进口本期,0)
,进口同比=cast(cast(isnull(a.进口本期,0)*100.0
/isnull(b.进口本期,0) as decimal(20,2)) as varchar)+'%'
,出口本期=isnull(a.出口本期,0)
,出口去年同期=isnull(b.出口本期,0)
,出口同比=cast(cast(isnull(a.出口本期,0)*100.0
/isnull(b.出口本期,0) as decimal(20,2)) as varchar)+'%'
from(
select 企业性质=case grouping(企业性质) when 0 then 企业性质 else '合计' end
,进出口本期=sum(数量)
,进口本期=sum(case 进出口标记 when '进口' then 数量 else 0 end)
,出口本期=sum(case 进出口标记 when '出口' then 数量 else 0 end)
,s1=grouping(企业性质) --排序用,因为你的示例结果要求合计排序在前面
from 表
where 年=@year and 月=@month
group by 企业性质 with rollup
)a full join(
select 企业性质=case grouping(企业性质) when 0 then 企业性质 else '合计' end
,进出口本期=sum(数量)
,进口本期=sum(case 进出口标记 when '进口' then 数量 else 0 end)
,出口本期=sum(case 进出口标记 when '出口' then 数量 else 0 end)
,s1=grouping(企业性质)
from 表
where 年=@year-1 and 月=@month
group by 企业性质 with rollup
)b on a.企业性质=b.企业性质
order by isnull(a.s1,b.s1) desc,isnull(a.企业性质,b.企业性质)
declare @year int,@month int
select @year=2004,@month=3 --定义要查询的年月select 标题
,进出口本期,进出口去年同期,进出口同比
,进口本期,进口去年同期,进口同比
,出口本期,出口去年同期,出口同比
from(--总的合计数
select 标题=isnull(a.标题,b.标题)
,进出口本期=isnull(a.进出口本期,0)
,进出口去年同期=isnull(b.进出口本期,0)
,进出口同比=cast(cast(isnull(a.进出口本期,0)*100.0
/isnull(b.进出口本期,0) as decimal(20,2)) as varchar)+'%'
,进口本期=isnull(a.进口本期,0)
,进口去年同期=isnull(b.进口本期,0)
,进口同比=cast(cast(isnull(a.进口本期,0)*100.0
/isnull(b.进口本期,0) as decimal(20,2)) as varchar)+'%'
,出口本期=isnull(a.出口本期,0)
,出口去年同期=isnull(b.出口本期,0)
,出口同比=cast(cast(isnull(a.出口本期,0)*100.0
/isnull(b.出口本期,0) as decimal(20,2)) as varchar)+'%'
,s1=4
from(
select 标题='合计'
,进出口本期=sum(数量)
,进口本期=sum(case 进出口标记 when '进口' then 数量 else 0 end)
,出口本期=sum(case 进出口标记 when '出口' then 数量 else 0 end)
from 表
where 年=@year and 月=@month
)a full join(
select 标题='合计'
,进出口本期=sum(数量)
,进口本期=sum(case 进出口标记 when '进口' then 数量 else 0 end)
,出口本期=sum(case 进出口标记 when '出口' then 数量 else 0 end)
from 表
where 年=@year-1 and 月=@month
)b on a.标题=b.标题union all --企业性质部分的统计
select 标题=isnull(a.企业性质,b.企业性质)
,进出口本期=isnull(a.进出口本期,0)
,进出口去年同期=isnull(b.进出口本期,0)
,进出口同比=cast(cast(isnull(a.进出口本期,0)*100.0
/isnull(b.进出口本期,0) as decimal(20,2)) as varchar)+'%'
,进口本期=isnull(a.进口本期,0)
,进口去年同期=isnull(b.进口本期,0)
,进口同比=cast(cast(isnull(a.进口本期,0)*100.0
/isnull(b.进口本期,0) as decimal(20,2)) as varchar)+'%'
,出口本期=isnull(a.出口本期,0)
,出口去年同期=isnull(b.出口本期,0)
,出口同比=cast(cast(isnull(a.出口本期,0)*100.0
/isnull(b.出口本期,0) as decimal(20,2)) as varchar)+'%'
,s1=isnull(a.s1,b.s1)
from(
select 企业性质=case grouping(企业性质) when 0 then 企业性质
else '按企业性质分类' end
,进出口本期=sum(数量)
,进口本期=sum(case 进出口标记 when '进口' then 数量 else 0 end)
,出口本期=sum(case 进出口标记 when '出口' then 数量 else 0 end)
,s1=grouping(企业性质) --排序用,因为你的示例结果要求合计排序在前面
from 表
where 年=@year and 月=@month
group by 企业性质 with rollup
)a full join(
select 企业性质=case grouping(企业性质) when 0 then 企业性质
else '按企业性质分类' end
,进出口本期=sum(数量)
,进口本期=sum(case 进出口标记 when '进口' then 数量 else 0 end)
,出口本期=sum(case 进出口标记 when '出口' then 数量 else 0 end)
,s1=grouping(企业性质)+2
from 表
where 年=@year-1 and 月=@month
group by 企业性质 with rollup
)b on a.企业性质=b.企业性质union all --商品类别部分的统计
select 标题=isnull(a.商品类别,b.商品类别)
,进出口本期=isnull(a.进出口本期,0)
,进出口去年同期=isnull(b.进出口本期,0)
,进出口同比=cast(cast(isnull(a.进出口本期,0)*100.0
/isnull(b.进出口本期,0) as decimal(20,2)) as varchar)+'%'
,进口本期=isnull(a.进口本期,0)
,进口去年同期=isnull(b.进口本期,0)
,进口同比=cast(cast(isnull(a.进口本期,0)*100.0
/isnull(b.进口本期,0) as decimal(20,2)) as varchar)+'%'
,出口本期=isnull(a.出口本期,0)
,出口去年同期=isnull(b.出口本期,0)
,出口同比=cast(cast(isnull(a.出口本期,0)*100.0
/isnull(b.出口本期,0) as decimal(20,2)) as varchar)+'%'
,s1=isnull(a.s1,b.s1)
from(
select 企业性质=case grouping(商品类别) when 0 then 商品类别
else '按商品类别分类' end
,进出口本期=sum(数量)
,进口本期=sum(case 进出口标记 when '进口' then 数量 else 0 end)
,出口本期=sum(case 进出口标记 when '出口' then 数量 else 0 end)
,s1=grouping(商品类别)
from 表
where 年=@year and 月=@month
group by 商品类别 with rollup
)a full join(
select 企业性质=case grouping(商品类别) when 0 then 商品类别
else '按商品类别分类' end
,进出口本期=sum(数量)
,进口本期=sum(case 进出口标记 when '进口' then 数量 else 0 end)
,出口本期=sum(case 进出口标记 when '出口' then 数量 else 0 end)
,s1=grouping(商品类别)
from 表
where 年=@year-1 and 月=@month
group by 商品类别 with rollup
)b on a.商品类别=b.商品类别)a order by s1 desc,标题
else '按商品类别分类' end
,进出口本期=sum(数量)
往里插值呵,参考一下 邹建 大哥的程序啊。
最后,
if (object_id('tempdb..#tmp) is not null)
Drop Table #tmp
(A.进出口本期-B.进出口本期)/B.进出口本期 AS 同比,
A.进口本期,B.进口本期 AS 进口去年同期,
(A.进口本期-B.进口本期)/B.进口本期 AS 同比,
A.出口本期,B.出口本期 AS 出口去年同期,
(A.出口本期-B.出口本期)/B.出口本期 AS 同比
FROM (
SELECT 企业性质 as 标题,SUM(数量) AS 进出口本期,
SUM(CASE WHEN 进出口标记='进口' THEN 数量 ELSE 0 END) AS 进口本期,
SUM(CASE WHEN 进出口标记='出口' THEN 数量 ELSE 0 END) AS 出口本期,
2 as type
FROM 数据表 WHERE 年=2004 AND 月=4 GROUP BY 企业性质
UNION ALL
SELECT 商品类别 as 标题,SUM(数量) AS 进出口本期,
SUM(CASE WHEN 进出口标记='进口' THEN 数量 ELSE 0 END) AS 进口本期,
SUM(CASE WHEN 进出口标记='出口' THEN 数量 ELSE 0 END) AS 出口本期,
3 as type
FROM 数据表 WHERE 年=2004 AND 月=4 GROUP BY 商品类别
UNION ALL
SELECT '合计' AS 标题,SUM(数量) AS 进出口本期,
SUM(CASE WHEN 进出口标记='进口' THEN 数量 ELSE 0 END) AS 进口本期,
SUM(CASE WHEN 进出口标记='出口' THEN 数量 ELSE 0 END) AS 出口本期,
1 as type
FROM 数据表 WHERE 年=2004 AND 月=4
) AS A,
(
SELECT 企业性质 AS 标题,SUM(数量) AS 进出口本期,
SUM(CASE WHEN 进出口标记='进口' THEN 数量 ELSE 0 END) AS 进口本期,
SUM(CASE WHEN 进出口标记='出口' THEN 数量 ELSE 0 END) AS 出口本期,
2 as type
FROM 数据表 WHERE 年=2004-1 AND 月=4 GROUP BY 企业性质
UNION ALL
SELECT 商品类别 AS 标题,SUM(数量) AS 进出口本期,
SUM(CASE WHEN 进出口标记='进口' THEN 数量 ELSE 0 END) AS 进口本期,
SUM(CASE WHEN 进出口标记='出口' THEN 数量 ELSE 0 END) AS 出口本期,
3 as type
FROM 数据表 WHERE 年=2004-1 AND 月=4 GROUP BY 商品类别
UNION ALL
SELECT '合计' AS 标题,SUM(数量) AS 进出口本期,
SUM(CASE WHEN 进出口标记='进口' THEN 数量 ELSE 0 END) AS 进口本期,
SUM(CASE WHEN 进出口标记='出口' THEN 数量 ELSE 0 END) AS 出口本期,
1 as type
FROM 数据表 WHERE 年=2004-1 AND 月=4
) AS B
WHERE A.标题=B.标题 and a.type=b.type
order by a.type,A.标题
还有个问题的万一没有上年的数据SELECT A.标题,A.进出口本期 AS 进出口本期,B.进出口本期 AS 进出口去年同期,
case when isnull(B.进出口本期,0)=0 then 0 else cast(A.进出口本期 as numeric(18,2))/B.进出口本期 end AS 同比, --百分比的格式自己改好不好?其他同比也自己改
A.进口本期,B.进口本期 AS 进口去年同期,
(A.进口本期-B.进口本期)/B.进口本期 AS 同比,
A.出口本期,B.出口本期 AS 出口去年同期,
(A.出口本期-B.出口本期)/B.出口本期 AS 同比
FROM (
SELECT 企业性质 as 标题,SUM(数量) AS 进出口本期,
SUM(CASE WHEN 进出口标记='进口' THEN 数量 ELSE 0 END) AS 进口本期,
SUM(CASE WHEN 进出口标记='出口' THEN 数量 ELSE 0 END) AS 出口本期,
2 as type
FROM 数据表 WHERE 年=2004 AND 月=4 GROUP BY 企业性质
UNION ALL
SELECT 商品类别 as 标题,SUM(数量) AS 进出口本期,
SUM(CASE WHEN 进出口标记='进口' THEN 数量 ELSE 0 END) AS 进口本期,
SUM(CASE WHEN 进出口标记='出口' THEN 数量 ELSE 0 END) AS 出口本期,
3 as type
FROM 数据表 WHERE 年=2004 AND 月=4 GROUP BY 商品类别
UNION ALL
SELECT '合计' AS 标题,SUM(数量) AS 进出口本期,
SUM(CASE WHEN 进出口标记='进口' THEN 数量 ELSE 0 END) AS 进口本期,
SUM(CASE WHEN 进出口标记='出口' THEN 数量 ELSE 0 END) AS 出口本期,
1 as type
FROM 数据表 WHERE 年=2004 AND 月=4
) AS A left join
(
SELECT 企业性质 AS 标题,SUM(数量) AS 进出口本期,
SUM(CASE WHEN 进出口标记='进口' THEN 数量 ELSE 0 END) AS 进口本期,
SUM(CASE WHEN 进出口标记='出口' THEN 数量 ELSE 0 END) AS 出口本期,
2 as type
FROM 数据表 WHERE 年=2004-1 AND 月=4 GROUP BY 企业性质
UNION ALL
SELECT 商品类别 AS 标题,SUM(数量) AS 进出口本期,
SUM(CASE WHEN 进出口标记='进口' THEN 数量 ELSE 0 END) AS 进口本期,
SUM(CASE WHEN 进出口标记='出口' THEN 数量 ELSE 0 END) AS 出口本期,
3 as type
FROM 数据表 WHERE 年=2004-1 AND 月=4 GROUP BY 商品类别
UNION ALL
SELECT '合计' AS 标题,SUM(数量) AS 进出口本期,
SUM(CASE WHEN 进出口标记='进口' THEN 数量 ELSE 0 END) AS 进口本期,
SUM(CASE WHEN 进出口标记='出口' THEN 数量 ELSE 0 END) AS 出口本期,
1 as type
FROM 数据表 WHERE 年=2004-1 AND 月=4
) AS B
on A.标题=B.标题 and a.type=b.type
order by a.type,A.标题
数据表结构如下:ID 企业性质 商品类别 进出口标记 数量 年 月
其中 企业性质有下列分类:
国有、三资
进出口标记有下列分类:
进口、出口商品类别有下列分类: 5001 适于缫丝的蚕茧 千克
5002 生丝(未加捻) 千克
5003 废丝(包括不宜缫丝的茧、废纱及回收纤维) 千克
5004 丝纱线(绢纺纱线除外),非供零售用 千克
5005 绢纺纱线,非供零售用 千克
5006 丝纱线及绢纺纱线,供零售用;蚕胶丝 千克
.....
.....
5999 绢纺纱线,非供零售用 千克
都是纺织类
8401 核反应堆及其未辐照燃料元件;同位素分离机 千克
8402 蒸汽锅炉;过热水锅炉 —
8403 集中供暖用的热水锅炉,但8402的货品除外 —
8404 8402或8403所列锅炉的辅助设备 千克
8405 煤气发生器;乙炔发生器等水解气体发生器 千克
8406 汽轮机 —
8407 点燃往复式或旋转式活塞内燃机 台/千瓦
......
......
—
8423 衡器(感量≤50mg的天平除外),砝码、秤砣 —
8424 液体或粉末喷射、散布等机械器具;灭火器等 —
8425 滑车及提升机;卷扬机及绞盘;千斤顶 台
8426 起重机等;移动式吊运架、跨运车等 台
都是机械类
要求形成的报表如下: 进出口本期 进出口去年同期 同比 进口本期 进口去年同期 同比 出口本期 出口去年同期 同比 合计
按企业性质分类
国有
三资
按商品类别分类
纺织
机械
帮忙呀!!
case when isnull(B.进出口本期,0)=0 then 0 else cast(A.进出口本期 as numeric(18,2))/B.进出口本期 end AS 同比, --百分比的格式自己改好不好?其他同比也自己改
A.进口本期,B.进口本期 AS 进口去年同期,
(A.进口本期-B.进口本期)/B.进口本期 AS 同比,
A.出口本期,B.出口本期 AS 出口去年同期,
(A.出口本期-B.出口本期)/B.出口本期 AS 同比
FROM (
SELECT 企业性质 as 标题,SUM(数量) AS 进出口本期,
SUM(CASE WHEN 进出口标记='进口' THEN 数量 ELSE 0 END) AS 进口本期,
SUM(CASE WHEN 进出口标记='出口' THEN 数量 ELSE 0 END) AS 出口本期,
3 as type
FROM 数据表 WHERE 年=2004 AND 月=4 GROUP BY 企业性质
UNION ALL
SELECT '按企业性质分类' as 标题,null 进出口本期,
null AS 进口本期,
null AS 出口本期,
2 as type
UNION ALL
SELECT '按商品类别分类' as 标题,null 进出口本期,
null AS 进口本期,
null AS 出口本期,
4 as type
UNION ALL
SELECT case when 商品类别 between 5001 and 5999 then '纺织'
when 商品类别 between 5401 and 5499 then '机械'
end as 标题,
SUM(数量) AS 进出口本期,
SUM(CASE WHEN 进出口标记='进口' THEN 数量 ELSE 0 END) AS 进口本期,
SUM(CASE WHEN 进出口标记='出口' THEN 数量 ELSE 0 END) AS 出口本期,
5 as type
FROM 数据表 WHERE 年=2004 AND 月=4
GROUP BY case when 商品类别 between 5001 and 5999 then '纺织'
when 商品类别 between 5401 and 5499 then '机械'
end
UNION ALL
SELECT '合计' AS 标题,SUM(数量) AS 进出口本期,
SUM(CASE WHEN 进出口标记='进口' THEN 数量 ELSE 0 END) AS 进口本期,
SUM(CASE WHEN 进出口标记='出口' THEN 数量 ELSE 0 END) AS 出口本期,
1 as type
FROM 数据表 WHERE 年=2004 AND 月=4
) AS A left join
(
SELECT 企业性质 AS 标题,SUM(数量) AS 进出口本期,
SUM(CASE WHEN 进出口标记='进口' THEN 数量 ELSE 0 END) AS 进口本期,
SUM(CASE WHEN 进出口标记='出口' THEN 数量 ELSE 0 END) AS 出口本期,
3 as type
FROM 数据表 WHERE 年=2004-1 AND 月=4 GROUP BY 企业性质
UNION ALL
SELECT case when 商品类别 between 5001 and 5999 then '纺织'
when 商品类别 between 5401 and 5499 then '机械'
end AS 标题,
SUM(数量) AS 进出口本期,
SUM(CASE WHEN 进出口标记='进口' THEN 数量 ELSE 0 END) AS 进口本期,
SUM(CASE WHEN 进出口标记='出口' THEN 数量 ELSE 0 END) AS 出口本期,
5 as type
FROM 数据表 WHERE 年=2004-1 AND 月=4
GROUP BY case when 商品类别 between 5001 and 5999 then '纺织'
when 商品类别 between 5401 and 5499 then '机械'
end
UNION ALL
SELECT '合计' AS 标题,SUM(数量) AS 进出口本期,
SUM(CASE WHEN 进出口标记='进口' THEN 数量 ELSE 0 END) AS 进口本期,
SUM(CASE WHEN 进出口标记='出口' THEN 数量 ELSE 0 END) AS 出口本期,
1 as type
FROM 数据表 WHERE 年=2004-1 AND 月=4
) AS B
on A.标题=B.标题 and a.type=b.type
order by a.type,A.标题