• 全部
  • 基础类
  • 应用实例
  • 新技术前沿

一个简单查询

hsh_boy 2008-02-29 09:50:26
有两个各如下:
流水帐表
日期 货号 入库数
2008-1-1 A 10
2008-1-5 B 20
2008-1-10 A 50

日期各:
日期
2008-1-1
2008-1-2
2008-1-3
2008-1-4
2008-1-5
2008-1-6
2008-1-7
2008-1-8
2008-1-9
2008-1-10

需求得到的查询结果为
日期 货号 入库数
2008-1-1 A 10
2008-1-2 A 0
2008-1-3 A 0
2008-1-4 A 0
2008-1-5 A 0
2008-1-6 A 0
2008-1-7 A 0
2008-1-8 A 0
2008-1-9 A 0
2008-1-10 A 50
2008-1-1 B 0
2008-1-2 B 0
2008-1-3 B 0
2008-1-4 B 0
2008-1-5 B 20
2008-1-6 B 0
2008-1-7 B 0
2008-1-8 B 0
2008-1-9 B 0
2008-1-10 B 0
请高手帮忙,谢谢
...全文
117 点赞 收藏 13
写回复
13 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
xiaoliaoyun 2008-02-29

declare @a table([日期] varchar(10),[货号] varchar(2),[入库数] int)
insert into @a
select '2008-1-1','A',10
union select '2008-1-5','B',20
union select '2008-1-10','A',50

declare @b table([日期] varchar(10))
insert into @b
select '2008-1-1'
union all select '2008-1-2'
union all select '2008-1-3'
union all select '2008-1-4'
union all select '2008-1-5'
union all select '2008-1-6'
union all select '2008-1-7'
union all select '2008-1-8'
union all select '2008-1-9'
union all select '2008-1-10'


select y.日期,y.货号,ISNULL(x.入库数,0)as 入库数 from @a x
right join
(select * from @b b cross join (select distinct 货号 from @a) a)y on x.日期 = y.日期 and x.货号 = y.货号
order by y.货号

回复
ojuju10 2008-02-29

create table t1(rq datetime,hh varchar(2),rks int)
go
insert into t1
select '2008-1-1','A',10
union select '2008-1-5','B',20
union select '2008-1-10','A',50
go
create table riqi(rq datetime)
go
insert into riqi
select '2008-1-1'
union all select '2008-1-2'
union all select '2008-1-3'
union all select '2008-1-4'
union all select '2008-1-5'
union all select '2008-1-6'
union all select '2008-1-7'
union all select '2008-1-8'
union all select '2008-1-9'
union all select '2008-1-10'
go

select a.rq,a.hh,isnull(rks,0) as rks from
(select * from (select distinct hh from t1 ) t1,riqi) a left join t1 b
on a.rq=b.rq and a.hh=b.hh
回复
dawugui 2008-02-29
6楼的,货号='A'是什么意思啊,我要是有10000个货号怎么办
-------------------------------------------------
我7楼已改.6楼考虑不完善.
回复
hsh_boy 2008-02-29
6楼的,货号='A'是什么意思啊,我要是有10000个货号怎么办
回复
dobear_0922 2008-02-29
create table 流水帐表(日期 datetime, 货号 varchar(10), 入库数 int)
insert into 流水帐表 values('2008-1-1 ', 'A', 10 )
insert into 流水帐表 values('2008-1-5 ', 'B', 20 )
insert into 流水帐表 values('2008-1-10', 'A', 50 )
create table 日期表(日期 datetime)
insert into 日期表 values('2008-1-1 ')
insert into 日期表 values('2008-1-2 ')
insert into 日期表 values('2008-1-3 ')
insert into 日期表 values('2008-1-4 ')
insert into 日期表 values('2008-1-5 ')
insert into 日期表 values('2008-1-6 ')
insert into 日期表 values('2008-1-7 ')
insert into 日期表 values('2008-1-8 ')
insert into 日期表 values('2008-1-9 ')
insert into 日期表 values('2008-1-10')
go

select m.日期 , 货号 = 'A' , isnull(n.入库数,0) 入库数 from 日期表 m left join 流水帐表 n on m.日期 = n.日期
union all
select m.日期 , 货号 = 'B' , isnull(n.入库数,0) 入库数 from 日期表 m left join 流水帐表 n on m.日期 = n.日期

drop table 流水帐表,日期表

/*
日期 货号 入库数
------------------------------------------------------ ---- -----------
2008-01-01 00:00:00.000 A 10
2008-01-02 00:00:00.000 A 0
2008-01-03 00:00:00.000 A 0
2008-01-04 00:00:00.000 A 0
2008-01-05 00:00:00.000 A 20
2008-01-06 00:00:00.000 A 0
2008-01-07 00:00:00.000 A 0
2008-01-08 00:00:00.000 A 0
2008-01-09 00:00:00.000 A 0
2008-01-10 00:00:00.000 A 50
2008-01-01 00:00:00.000 B 10
2008-01-02 00:00:00.000 B 0
2008-01-03 00:00:00.000 B 0
2008-01-04 00:00:00.000 B 0
2008-01-05 00:00:00.000 B 20
2008-01-06 00:00:00.000 B 0
2008-01-07 00:00:00.000 B 0
2008-01-08 00:00:00.000 B 0
2008-01-09 00:00:00.000 B 0
2008-01-10 00:00:00.000 B 50

(所影响的行数为 20 行)
*/
回复
dawugui 2008-02-29
--我前面的都不完善,这个可以了.
create table 流水帐表(日期 datetime, 货号 varchar(10), 入库数 int)
insert into 流水帐表 values('2008-1-1 ', 'A', 10 )
insert into 流水帐表 values('2008-1-5 ', 'B', 20 )
insert into 流水帐表 values('2008-1-10', 'A', 50 )
create table 日期表(日期 datetime)
insert into 日期表 values('2008-1-1 ')
insert into 日期表 values('2008-1-2 ')
insert into 日期表 values('2008-1-3 ')
insert into 日期表 values('2008-1-4 ')
insert into 日期表 values('2008-1-5 ')
insert into 日期表 values('2008-1-6 ')
insert into 日期表 values('2008-1-7 ')
insert into 日期表 values('2008-1-8 ')
insert into 日期表 values('2008-1-9 ')
insert into 日期表 values('2008-1-10')
go

select t1.* , isnull(t2.入库数,0) 入库数 from
(select n.日期 , m.货号 from (select distinct 货号 from 流水帐表) m , 日期表 n) t1
full join 流水帐表 t2
on t1.日期 = t2.日期 and t1.货号 = t2.货号

drop table 流水帐表,日期表

/*
日期 货号 入库数
------------------------------------------------------ ---- -----------
2008-01-01 00:00:00.000 A 10
2008-01-02 00:00:00.000 A 0
2008-01-03 00:00:00.000 A 0
2008-01-04 00:00:00.000 A 0
2008-01-05 00:00:00.000 A 0
2008-01-06 00:00:00.000 A 0
2008-01-07 00:00:00.000 A 0
2008-01-08 00:00:00.000 A 0
2008-01-09 00:00:00.000 A 0
2008-01-10 00:00:00.000 A 50
2008-01-01 00:00:00.000 B 0
2008-01-02 00:00:00.000 B 0
2008-01-03 00:00:00.000 B 0
2008-01-04 00:00:00.000 B 0
2008-01-05 00:00:00.000 B 20
2008-01-06 00:00:00.000 B 0
2008-01-07 00:00:00.000 B 0
2008-01-08 00:00:00.000 B 0
2008-01-09 00:00:00.000 B 0
2008-01-10 00:00:00.000 B 0

(所影响的行数为 20 行)
*/
回复
dawugui 2008-02-29
create table 流水帐表(日期 datetime, 货号 varchar(10), 入库数 int)
insert into 流水帐表 values('2008-1-1 ', 'A', 10 )
insert into 流水帐表 values('2008-1-5 ', 'B', 20 )
insert into 流水帐表 values('2008-1-10', 'A', 50 )
create table 日期表(日期 datetime)
insert into 日期表 values('2008-1-1 ')
insert into 日期表 values('2008-1-2 ')
insert into 日期表 values('2008-1-3 ')
insert into 日期表 values('2008-1-4 ')
insert into 日期表 values('2008-1-5 ')
insert into 日期表 values('2008-1-6 ')
insert into 日期表 values('2008-1-7 ')
insert into 日期表 values('2008-1-8 ')
insert into 日期表 values('2008-1-9 ')
insert into 日期表 values('2008-1-10')
go

select m.日期 , 货号 = 'A' , isnull(n.入库数,0) 入库数 from 日期表 m left join 流水帐表 n on m.日期 = n.日期 and n.货号 = 'A'
union all
select m.日期 , 货号 = 'B' , isnull(n.入库数,0) 入库数 from 日期表 m left join 流水帐表 n on m.日期 = n.日期 and n.货号 = 'B'

drop table 流水帐表,日期表

/*
日期 货号 入库数
------------------------------------------------------ ---- -----------
2008-01-01 00:00:00.000 A 10
2008-01-02 00:00:00.000 A 0
2008-01-03 00:00:00.000 A 0
2008-01-04 00:00:00.000 A 0
2008-01-05 00:00:00.000 A 0
2008-01-06 00:00:00.000 A 0
2008-01-07 00:00:00.000 A 0
2008-01-08 00:00:00.000 A 0
2008-01-09 00:00:00.000 A 0
2008-01-10 00:00:00.000 A 50
2008-01-01 00:00:00.000 B 0
2008-01-02 00:00:00.000 B 0
2008-01-03 00:00:00.000 B 0
2008-01-04 00:00:00.000 B 0
2008-01-05 00:00:00.000 B 20
2008-01-06 00:00:00.000 B 0
2008-01-07 00:00:00.000 B 0
2008-01-08 00:00:00.000 B 0
2008-01-09 00:00:00.000 B 0
2008-01-10 00:00:00.000 B 0

(所影响的行数为 20 行)
*/
回复
$扫地僧$ 2008-02-29

create table 流水帐(日期 datetime,货号 varchar(2),入库数 int)
go
insert into 流水帐
select '2008-1-1','A',10
union select '2008-1-5','B',20
union select '2008-1-10','A',50
go
create table 日期(日期 datetime)
go
insert into 日期
select '2008-1-1'
union all select '2008-1-2'
union all select '2008-1-3'
union all select '2008-1-4'
union all select '2008-1-5'
union all select '2008-1-6'
union all select '2008-1-7'
union all select '2008-1-8'
union all select '2008-1-9'
union all select '2008-1-10'
go

select B.日期,B.货号,isnull(A.入库数,0) as 入库数
from 流水帐 A right join
(select TA.货号,TB.日期 from (select DISTINCT 货号 from 流水帐) TA,日期 TB ) B
on A.货号=B.货号 and A.日期 =B.日期

回复
dawugui 2008-02-29
create table 流水帐表(日期 datetime, 货号 varchar(10), 入库数 int)
insert into 流水帐表 values('2008-1-1 ', 'A', 10 )
insert into 流水帐表 values('2008-1-5 ', 'B', 20 )
insert into 流水帐表 values('2008-1-10', 'A', 50 )
create table 日期表(日期 datetime)
insert into 日期表 values('2008-1-1 ')
insert into 日期表 values('2008-1-2 ')
insert into 日期表 values('2008-1-3 ')
insert into 日期表 values('2008-1-4 ')
insert into 日期表 values('2008-1-5 ')
insert into 日期表 values('2008-1-6 ')
insert into 日期表 values('2008-1-7 ')
insert into 日期表 values('2008-1-8 ')
insert into 日期表 values('2008-1-9 ')
insert into 日期表 values('2008-1-10')
go

select m.日期 , 货号 = 'A' , isnull(n.入库数,0) 入库数 from 日期表 m left join 流水帐表 n on m.日期 = n.日期
union all
select m.日期 , 货号 = 'B' , isnull(n.入库数,0) 入库数 from 日期表 m left join 流水帐表 n on m.日期 = n.日期

drop table 流水帐表,日期表

/*
日期 货号 入库数
------------------------------------------------------ ---- -----------
2008-01-01 00:00:00.000 A 10
2008-01-02 00:00:00.000 A 0
2008-01-03 00:00:00.000 A 0
2008-01-04 00:00:00.000 A 0
2008-01-05 00:00:00.000 A 20
2008-01-06 00:00:00.000 A 0
2008-01-07 00:00:00.000 A 0
2008-01-08 00:00:00.000 A 0
2008-01-09 00:00:00.000 A 0
2008-01-10 00:00:00.000 A 50
2008-01-01 00:00:00.000 B 10
2008-01-02 00:00:00.000 B 0
2008-01-03 00:00:00.000 B 0
2008-01-04 00:00:00.000 B 0
2008-01-05 00:00:00.000 B 20
2008-01-06 00:00:00.000 B 0
2008-01-07 00:00:00.000 B 0
2008-01-08 00:00:00.000 B 0
2008-01-09 00:00:00.000 B 0
2008-01-10 00:00:00.000 B 50

(所影响的行数为 20 行)
*/
回复
青锋-SS 2008-02-29
create table t1(rq datetime,hh varchar(2),rks int)
/*流水帐表
日期 货号 入库数*/
go
insert into t1
select '2008-1-1','A',10
union select '2008-1-5','B',20
union select '2008-1-10','A',50
go
create table riqi(rq datetime)
/*日期各:
日期*/
go
insert into riqi
select '2008-1-1'
union all select '2008-1-2'
union all select '2008-1-3'
union all select '2008-1-4'
union all select '2008-1-5'
union all select '2008-1-6'
union all select '2008-1-7'
union all select '2008-1-8'
union all select '2008-1-9'
union all select '2008-1-10'
go
select convert(char(10),riqi.rq,120) as '日期',isnull(hh,0) as '货号',isnull(rks,0) as '入库数' from riqi full join t1 on riqi.rq=t1.rq
go
drop table t1,riqi
go

(3 行受影响)

(10 行受影响)
日期 货号 入库数
---------- ---- -----------
2008-01-01 A 10
2008-01-02 0 0
2008-01-03 0 0
2008-01-04 0 0
2008-01-05 B 20
2008-01-06 0 0
2008-01-07 0 0
2008-01-08 0 0
2008-01-09 0 0
2008-01-10 A 50

(10 行受影响)

回复
$扫地僧$ 2008-02-29

select B.日期,B.货号,A.入库数
from 流水帐表 A right join
(select TA.货号,TB.日期 from (select DISTINCT 货号 from 流水帐) TA,日期 TB ) B
on A.货号=B.货号 and A.日期 =B.日期

回复
dawugui 2008-02-29
select * from 流水帐表 
union all
select 日期 , 货号 = '' , 入库数 = 0 from 日期表
order by 货号,日期
回复
hsh_boy 2008-02-29
问题解决,谢谢大家的帮忙
回复
相关推荐
发帖
MS-SQL Server
创建于2007-09-28

3.3w+

社区成员

MS-SQL Server相关内容讨论专区
申请成为版主
帖子事件
创建了帖子
2008-02-29 09:50
社区公告
暂无公告