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

一个统计语句,用于报表
现在有两个查询结果

项目名称 概算类型 概算名称 概算金额
中三改造 工程概算 121 80



项目名称 合同类型 合同编号 合同名称 合同金额
中三改造 建设合同 1212 城投 100
中三改造 建设合同 45 4545 20

如何形成这样的结果

项目名称 概算类型 概算名称 概算金额 合同类型 合同编号 合同名称 合同金额
中三改造 工程概算 121 80 建设合同 1212 城投 100
  建设合同 45 4545 20 

就是这样合并查询结果
最好是实现这样的
项目名称 概算类型 概算名称 概算金额 合同类型 合同编号 合同名称 合同金额
中三改造 工程概算 121 80 建设合同 1212 城投 100
  建设合同 45 4545 20 
  小计: 80 120
  合计: 80 120
合计就是把不同项目的小计加起来

------解决方案--------------------
SQL code

with 
t1 as
(select '中三改造' 项目名称, '工程概算' 概算类型, '121' 概算名称, 80 概算金额),
t2 as
(select '中三改造' 项目名称, '建设合同' 合同类型, '1212' 合同编号,'城投' 合同名称,100 合同金额
 union all
 select '中三改造', '建设合同', '45', '4545', 20),
t3 as 
(select row_number() over(partition by t1.项目名称 order by getdate()) rn,
t1.项目名称, t1.概算类型, t1.概算名称, cast(t1.概算金额 as varchar) 概算金额,
t2.合同类型, t2.合同编号, t2.合同名称, t2.合同金额 
from t1 inner join t2 on t1.项目名称=t2.项目名称),
t4 as
(select 
case when rn>1 then '' else 项目名称 end '项目名称',
case when rn>1 then '' else 概算类型 end '概算类型',
case when rn>1 then '' else 概算名称 end '概算名称',
case when rn>1 then '' else 概算金额 end '概算金额',
合同类型,合同编号,合同名称,合同金额 from t3)
select * from t4
union all
select '','','小计:',cast(sum(case when rn=1 then cast(概算金额 as int) else 0 end) as varchar),
'','','',sum(cast(合同金额 as int)) from t3 group by 项目名称
union all
select '','','合计:',cast(sum(case when rn=1 then cast(概算金额 as int) else 0 end) as varchar),
'','','',sum(cast(合同金额 as int)) from t3


项目名称   概算类型   概算名称  概算金额                  合同类型  合同编号 合同名称 合同金额
-------- -------- ----- ------------------------------ -------- ---- ---- -----------
中三改造   工程概算   121        80                     建设合同   1212   城投    100
                                                      建设合同   45     4545    20
                  小计:        80                                             120
                  合计:        80                                             120

(4 row(s) affected)