一个表多个查询条件的关联或多个表的关联有关问题(join?union?)
一个表多个查询条件的关联或多个表的关联问题(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数
----------------------------------------------------
我可以用如下语句:
但这样写的语句实在太长了,有错也很难修改,何况小组远不止一个……
其实我想达到的目的就是以下两个语句的集合,但不知道如果做:
语句1:
和
语句2
这两个查询语句的结果用来横向连接显示,然后增加一个“积分”的列,按上面的条件计算,我该如何做?
先解决这个问题,再说如果我把不同产品和合同放到不同表中该如何关联合并的问题。
------解决方案--------------------
比如,一个表(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 */ --是这个意思吗?