SQL循环查询如何合并查询结果到一个表,每个结果表作为一个字段 30
我需要查询出一个表来显示从上个月到之前之前某个月期间,每个月的订单总价值(也就是所有订单日期在某月范围内的,它们的订单价值之和),而至于具体需要查询出几个月的总价值,这个是动态的,由用户的需求决定,所以没法做成简单的表之间的join,得用循环,比如我用一个@index来表示用户指定从上月到之前第几个月,以@index的值非负为循环条件,但是这样弄出来的是好几个结果表,每个表是一个月的订单总价值,而我希望能弄成一个表,只有一条记录的表,一个字段对应一个月的订单总价值。
所以这里有两个疑问:第一,如何把这几个查询出来的结果表合并到一起
第二,合并到一起后怎么为每个字段起个互不相同的字段名
高分悬赏,谢谢!! 展开
简单写了一个sqlserver的
按照你说的建个表,放了点数据
create table 订单
(订单号 int,
订单日期 datetime,
订单价值 int)
insert into 订单 values(1,'2013-05-01',10)
insert into 订单 values(2,'2013-05-01',20)
insert into 订单 values(3,'2013-06-01',30)
insert into 订单 values(4,'2013-06-01',40)
insert into 订单 values(5,'2013-07-01',50)
insert into 订单 values(6,'2013-08-01',60)
insert into 订单 values(7,'2013-08-01',70)
insert into 订单 values(8,'2013-09-01',80)
insert into 订单 values(9,'2013-09-01',90)
insert into 订单 values(10,'2013-10-01',100)
insert into 订单 values(11,'2013-10-01',110)
insert into 订单 values(12,'2013-11-01',120)
insert into 订单 values(13,'2013-11-01',130)
insert into 订单 values(14,'2013-12-01',140)
你要查上个月到之前某个月的
所以执行这个
declare @sql varchar(4000)
declare @index int
set @index=2 --这个就是你说的要查前某个月的,这里写2就代表9,10,11三个月
set @sql = 'select ''汇总'' as 汇总'
select @sql = @sql + ',sum(isnull(case convert(varchar(7),订单日期,120) when '''+convert(varchar(7),[订单日期],120)+''' then [订单价值] end,0)) as
['+convert(varchar(7),[订单日期],120)+']'
from (select distinct convert(varchar(7),订单日期,120) 订单日期 from [订单] where
convert(varchar(7),订单日期,120)>=convert(varchar(7),dateadd(month,(-1-cast('' + @index + '' as int)),getdate()),120)
and convert(varchar(7),订单日期,120)<convert(varchar(7),getdate(),120)) as a
select @sql = @sql+' from [订单]'
exec (@sql) --这句我是执行sql,你可以直接把上句改成create table的形式,把sql语句print出来,看看
结果
辛苦你了,谢谢你的解答,但是我要的index是动态的,不是静态的,就是假设不知道index事先是几,是个变量,要用循环写。
对啊,那个2是动态输入的啊,你可以写成存储过程的形式啊,我就是怕麻烦,给你写这个东西,别说你看不懂
--先解决第一问题,第一个问题其实就一个查询语句就可以了
declare @index int
set @index=-3 --该数值必须是负数,-3的意思是,加入现在是12月,那么数据取的就是9,10,11
select convert(varchar(7),订单日期,120) as '订单年月',sum(订单价值)
from 数据表
where 订单日期 between
dateadd(month,@index,(convert(varchar(7),dateadd(month,-1,getdate()),120)+'-01'))
and dateadd(day,-1,(convert(varchar(7),getdate(),120)+'-01'))
group by convert(varchar(7),订单日期,120)
order by convert(varchar(7),订单日期,120)
上面的语句的结果格式就是
订单年月 订单总价值
2012-11 12345.00
2012-10 1245.154
2012-09 1254.22
--结合第二个问题,我有新的想法,在实际工作中,加入你的表字段个数不统一,在展示为报表的时候是很麻烦的。下面是我的一个想法,不知道是否可以给你参考
declare @index int
set @index=-3 --该数值必须是负数,-3的意思是,加入现在是12月,那么数据取的就是9,10,11
select convert(varchar(4),订单日期,120) as '订单年',
sum(case when month(订单日期)=1 then 订单价值 else 0 end) as '一月份价值总和',
sum(case when month(订单日期)=2 then 订单价值 else 0 end) as '二月份价值总和',
sum(case when month(订单日期)=3 then 订单价值 else 0 end) as '三月份价值总和',
sum(case when month(订单日期)=4 then 订单价值 else 0 end) as '四月份价值总和',
sum(case when month(订单日期)=5 then 订单价值 else 0 end) as '五月份价值总和',
sum(case when month(订单日期)=6 then 订单价值 else 0 end) as '六月份价值总和',
sum(case when month(订单日期)=7 then 订单价值 else 0 end) as '七月份价值总和',
sum(case when month(订单日期)=8 then 订单价值 else 0 end) as '八月份价值总和',
sum(case when month(订单日期)=9 then 订单价值 else 0 end) as '九月份价值总和',
sum(case when month(订单日期)=10 then 订单价值 else 0 end) as '十月份价值总和',
sum(case when month(订单日期)=11 then 订单价值 else 0 end) as '十一月份价值总和',
sum(case when month(订单日期)=12 then 订单价值 else 0 end) as '十二月份价值总和'
from 数据表
where 订单日期 between
dateadd(month,@index,(convert(varchar(7),dateadd(month,-1,getdate()),120)+'-01'))
and dateadd(day,-1,(convert(varchar(7),getdate(),120)+'-01'))
group by convert(varchar(4),订单日期,120)
order by convert(varchar(4),订单日期,120)
上面的语句的结果格式就是
订单年 一月份 二月份 三月份 四月份 五月份 六月份 ... 九月份 十月份 十一月份 十二月份
2013 0.00 0.00 0.00 0.00 0.00 0.00 ...254.11 25.55 7125.6 0.00
加入客户要看过去30个月的数据,按你的需求有30个字段,看起来就很乱了。
上述语句总的是13个字段,第一个字段是年,其他是月份。那么如果客户要看30个月的与当前是2013-12为准,那么就是2013-11到2011-05 展示的格式就是
订单年 一月份 二月份 三月份 四月份 五月份 六月份 ... 九月份 十月份 十一月份 十二月份
2013 87 13 32 12 1254 12.3 ...254.11 25.55 7125.6 0.00
2012 25.5 3565 254 155 655 235 ... 544 458 8989 8889
2011 0.00 0.00 0.00 0.00 22.1 255.0 ... 256.1 2365 625 3652
不知道是否这个想法有帮助到你。
select t.编号,a.数量A,b.数量B,c.数量C from
(
select 编号 from 表a union
select 编号 from 表b union
select 编号 from 表c
) t
left join 表a a on t.编号=a.编号
left join 表b b on t.编号=b.编号
left join 表c c on t.编号=c.编号
具体代码如下:
--创建用于存储相同数据的临时表
CREATE TABLE #TempTB (
TId int,
TName varchar(50),
SubjectId int,
TType int
)
--插入考试表数据,1表示是考试
insert into #TempTB(TId,TName,SubjectId,TType)
select EId,EName,SubjectId,EStartTime ,1
from ExamTB
--插入任务表数据,2表示此数据是来自任务表
insert into #TempTB(TId,TName,SubjectId,TType)
select TId,TName,SubjectId,TStartTime,2
from TaskTB
--输出数据
select * from #TempTB
--删除临时表
drop table #TempTB