球一个SQL语句:自动补充其他月份为0

weisaisz 2013-11-29 02:51:51
原始数据:

年 月 销售 业绩
2013 5 张三 1000



需要的查询后得出这样的结果
年 月 销售 业绩
2013 1 张三 0
2013 2 张三 0
2013 3 张三 0
2013 4 张三 0
2013 5 张三 1000
2013 6 张三 0
...
2013 12 张三 0

或者如果上面比较难,这样也可以
年 月 销售 业绩
2013 1 张三 0
2013 2 张三 0
2013 3 张三 0
2013 4 张三 0
2013 5 张三 0
2013 5 张三 1000
2013 6 张三 0
...
2013 12 张三 0


...全文
663 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
LongRui888 2013-11-30
  • 打赏
  • 举报
回复
引用 4 楼 fengqingtao2008 的回复:
[quote=引用 1 楼 yupeigu 的回复:]


--drop table tb

create table tb(年 int, 月 int,  销售 varchar(10), 业绩 int)

insert into tb
select 2013 ,  5 ,  '张三' ,   '1000'


select tt.年,t.number as 月,tt.销售,ISNULL(tb.业绩,0) as 业绩
from  
(
select 年,销售 from tb 
)tt
inner join master..spt_values t
        on t.type = 'P' and t.number >= 1 and t.number <=12
left join tb
       on tb.年 = tt.年
          and tb.销售 = tt.销售
          and tb.月 = t.number
/*
年	    月	销售	业绩
2013	1	张三	0
2013	2	张三	0
2013	3	张三	0
2013	4	张三	0
2013	5	张三	1000
2013	6	张三	0
2013	7	张三	0
2013	8	张三	0
2013	9	张三	0
2013	10	张三	0
2013	11	张三	0
2013	12	张三	0
*/
学习了. master..spt_values相当于一个数字辅助表,在sql中主要用到number这个字段。 相对固定通用的取数字的表 主要作用就是取连续数字 不过有个缺陷就是只能取到2047[/quote] 呵呵,这个可以通过递归来实现,这样能更大一点
无涯大者 2013-11-30
  • 打赏
  • 举报
回复
引用 1 楼 yupeigu 的回复:


--drop table tb

create table tb(年 int, 月 int,  销售 varchar(10), 业绩 int)

insert into tb
select 2013 ,  5 ,  '张三' ,   '1000'


select tt.年,t.number as 月,tt.销售,ISNULL(tb.业绩,0) as 业绩
from  
(
select 年,销售 from tb 
)tt
inner join master..spt_values t
        on t.type = 'P' and t.number >= 1 and t.number <=12
left join tb
       on tb.年 = tt.年
          and tb.销售 = tt.销售
          and tb.月 = t.number
/*
年	    月	销售	业绩
2013	1	张三	0
2013	2	张三	0
2013	3	张三	0
2013	4	张三	0
2013	5	张三	1000
2013	6	张三	0
2013	7	张三	0
2013	8	张三	0
2013	9	张三	0
2013	10	张三	0
2013	11	张三	0
2013	12	张三	0
*/
学习了. master..spt_values相当于一个数字辅助表,在sql中主要用到number这个字段。 相对固定通用的取数字的表 主要作用就是取连续数字 不过有个缺陷就是只能取到2047
中国风 2013-11-30
  • 打赏
  • 举报
回复
查询条件用开始/结束日期,通过开始/结束生成对应的月份,这样才有点意义
lzw_0736 2013-11-29
  • 打赏
  • 举报
回复

--創建數據
create table #tb(年 int, 月 int,  销售 varchar(10), 业绩 int)
 
insert into #tb
select 2013 ,  5 ,  '张三' ,   1000
UNION ALL
select 2013 ,  6 ,  '张三' ,   2000
 
--查詢
SELECT b.年,b.月,b.销售,ISNULL(c.业绩,0) 业绩
FROM
(
SELECT a.年,t.number 月,a.销售
FROM (SELECT DISTINCT 年,销售 FROM #tb) a,master..spt_values t
WHERE t.type = 'P' and t.number >= 1 and t.number <=12
) b
LEFT JOIN #tb c ON b.年=c.年 AND b.月=c.月 AND b.销售=c.销售
哥眼神纯洁不 2013-11-29
  • 打赏
  • 举报
回复

with a(a,b,c,d)as(
select 2013,5,'a',1000)
select a,case when b=number then b else number end,
       c,case when b=number then d else 0 end
from a 
left join(select distinct number from master..spt_values 
where number between 1 and 12)b
on 1=1
LongRui888 2013-11-29
  • 打赏
  • 举报
回复


--drop table tb

create table tb(年 int, 月 int,  销售 varchar(10), 业绩 int)

insert into tb
select 2013 ,  5 ,  '张三' ,   '1000'


select tt.年,t.number as 月,tt.销售,ISNULL(tb.业绩,0) as 业绩
from  
(
select 年,销售 from tb 
)tt
inner join master..spt_values t
        on t.type = 'P' and t.number >= 1 and t.number <=12
left join tb
       on tb.年 = tt.年
          and tb.销售 = tt.销售
          and tb.月 = t.number
/*
年	    月	销售	业绩
2013	1	张三	0
2013	2	张三	0
2013	3	张三	0
2013	4	张三	0
2013	5	张三	1000
2013	6	张三	0
2013	7	张三	0
2013	8	张三	0
2013	9	张三	0
2013	10	张三	0
2013	11	张三	0
2013	12	张三	0
*/

34,836

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧