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

一个表多个查询条件的关联或多个表的关联问题(join?union?)
比如,一个表(report)里面有如下字段:
--------------------------------------------------
销售人员 销售小组 产品1销售金额 产品1销售日期 产品2销售金额 产品2销售日期 合同1 合同1签约日期
  A 第一组 5 2012-04-01  
  B 第二组 10 2012-04-02 有效 2012-04-03
......
---------------------------------------------------
现需要统计一个这样的结果:

销售小组 产品1销售金额 产品2销售金额 合同1签约数 得分 '得分公式=(产品1金额+产品2金额)/10000+合同1数
----------------------------------------------------
我可以用如下语句:
SQL code
select
 销售小组='第一组',
产品1销售金额=(select isnull(sum(产品1金额),0) from report where 销售小组='第1组'),
产品2销售金额=(select isnull(sum(产品2金额),0) from report where 销售小组='第1组'),
合同1签约数=(select count(*) from report where 合同1=‘有效’),
得分=(select isnull(sum(产品1金额),0) from report where 销售小组='第1组')/10000+
(select isnull(sum(产品2金额),0) from report where 销售小组='第1组')/10000
+(select count(*) from report where 合同1=‘有效’)
union
......(小组2的记录,语句同小组1)


但这样写的语句实在太长了,有错也很难修改,何况小组远不止一个……
其实我想达到的目的就是以下两个语句的集合,但不知道如果做:
语句1:
SQL code
select 销售小组,sum(产品1销售金额) as 产品1金额,sum(产品2金额) as 产品2金额 
from report
group by 销售小组



语句2
SQL code
select 销售小组,count(*) as 合同1签约数 from report
where 合同1='有效'
group by 销售小组

 
这两个查询语句的结果用来横向连接显示,然后增加一个“积分”的列,按上面的条件计算,我该如何做?
先解决这个问题,再说如果我把不同产品和合同放到不同表中该如何关联合并的问题。

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


go
if OBJECT_ID('report')is not null
drop table report
go
create table report(
销售人员 varchar(10),
销售小组 varchar(8),
产品1销售金额 money,
产品1销售日期 date,
产品2销售金额 money,
产品2销售日期 date,
合同1 varchar(4),
合同1签约日期 date
)
go
insert report
select '张三','第一组',10,'2012-04-01',5,'2012-04-02',null,null union all
select '李四','第二组',null,null,null,null,'有效','2012-04-03' union all
select '王五','第三组',null,null,5,'2012-04-10','无效','2012-04-2'

select * from report

select 销售小组,sum(isnull(产品1销售金额,0)) as 产品1金额,
sum(isnull(产品2销售金额,0)) as 产品2金额,
sum(case when 合同1='有效' then 1 else 0 end) as 合同1数量,
sum(isnull(产品1销售金额,0)+isnull(产品2销售金额,0)+
(case when 合同1='有效' then 1 else 0 end))得分 from report
where 产品1销售日期='2012-04-01' 
or 产品2销售日期='2012-04-01' 
or 合同1签约日期='2012-04-01' 
group by 销售小组

/*
销售小组    产品1金额    产品2金额    合同1数量    得分
第一组    10.00    5.00    0    15.00
*/

--是这个意思吗?