SQL循环查询如何合并查询结果到一个表,每个结果表作为一个字段 30

我有个订单数据表,包含订单号,订单日期,订单价值,我需要查询出一个表来显示从上个月到之前之前某个月期间,每个月的订单总价值(也就是所有订单日期在某月范围内的,它们的订单价... 我有个订单数据表,包含订单号,订单日期,订单价值,
我需要查询出一个表来显示从上个月到之前之前某个月期间,每个月的订单总价值(也就是所有订单日期在某月范围内的,它们的订单价值之和),而至于具体需要查询出几个月的总价值,这个是动态的,由用户的需求决定,所以没法做成简单的表之间的join,得用循环,比如我用一个@index来表示用户指定从上月到之前第几个月,以@index的值非负为循环条件,但是这样弄出来的是好几个结果表,每个表是一个月的订单总价值,而我希望能弄成一个表,只有一条记录的表,一个字段对应一个月的订单总价值。

所以这里有两个疑问:第一,如何把这几个查询出来的结果表合并到一起
第二,合并到一起后怎么为每个字段起个互不相同的字段名

高分悬赏,谢谢!!
展开
 我来答
badkano
推荐于2018-03-13 · 知道合伙人体育行家
badkano
知道合伙人体育行家
采纳数:144776 获赞数:885369
团长

向TA提问 私信TA
展开全部

简单写了一个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是动态输入的啊,你可以写成存储过程的形式啊,我就是怕麻烦,给你写这个东西,别说你看不懂
Ice海Man
2013-12-14 · TA获得超过302个赞
知道小有建树答主
回答量:203
采纳率:0%
帮助的人:205万
展开全部

--先解决第一问题,第一个问题其实就一个查询语句就可以了

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

 

不知道是否这个想法有帮助到你。

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
糖糖寳寳
2015-09-08 · TA获得超过6.4万个赞
知道大有可为答主
回答量:1.8万
采纳率:92%
帮助的人:3959万
展开全部
  需考虑表B的数量比表A多,表C的数量比表B多,不然会丢失数据
  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
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式