如何查询?

wolfpzp 2003-09-29 08:21:10
我是数据表是:
CREATE TABLE Num
{
Name NVARCHAR ( 100 ),
Date DATETIME,
Value int DEFAULT 0
}

记录是这样的:
a 2003-09-29 3 (星期一)
a 2003-09-28 2 (星期日)
a 2003-09-30 4 (星期二)
a 2003-10-01 6 (星期三)
a 2003-10-06 6 (星期一)
a 2003-10-05 6 (星期日)
a 2003-09-27 7 (星期六)
a 2003-09-26 8 (星期五)
a 2003-09-25 7 (星期四)
a 2003-09-24 3 (星期三)
a 2003-09-23 7 (星期二)
b 2003-09-28 2 (星期日)

2003-09-23(星期二) —— 2003-09-27(星期六) 在一周之内
2003-09-28(星期日) —— 2003-10-04(星期六) 在一周之内
2003-10-05(星期日) —— 2003-10-10(星期六) 在一周之内

根据给定的时间段,比如2003-09-24 到 2003-10-05
那么应该是:
2003-09-24到2003-09-27中的值是一个字段,字段以起始时间2003-09-24为名
2003-09-28到2003-10-04中的值是一个字段,字段以起始时间2003-09-28为名
2003-10-05到2003-10-05中的值是一个字段,字段以起始时间2003-10-05为名
查询的结果如下:
NAME [2003-09-24] [2003-09-28] [2003-10-05]
a 25 15 6
b 0 2 0

如何查询?谢谢!
...全文
48 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
pengdali 2003-10-08
  • 打赏
  • 举报
回复
CREATE TABLE #T1(id int,
Name NVARCHAR ( 100 ),
Date DATETIME
)

insert #T1 values(1,'a','2003-09-29')
insert #T1 values(2,'a','2003-09-28')
insert #T1 values(3,'a','2003-09-30')
insert #T1 values(4,'a','2003-10-01')
insert #T1 values(5,'a','2003-10-06')
insert #T1 values(6,'a','2003-10-05')
insert #T1 values(7,'a','2003-09-27')
insert #T1 values(8,'a','2003-09-26')
insert #T1 values(9,'a','2003-09-25')
insert #T1 values(10,'a','2003-09-24')
insert #T1 values(11,'a','2003-09-23')
insert #T1 values(1,'b','2003-09-28')

CREATE TABLE #T2(id int,
Name NVARCHAR ( 100 ),
Value int DEFAULT 0
)

insert #T2 values(1,'a',3)
insert #T2 values(2,'a',2)
insert #T2 values(3,'a',4)
insert #T2 values(4,'a',6)
insert #T2 values(5,'a',6)
insert #T2 values(6,'a',6)
insert #T2 values(7,'a',7)
insert #T2 values(8,'a',8)
insert #T2 values(9,'a',7)
insert #T2 values(10,'a',3)
insert #T2 values(11,'a',7)
insert #T2 values(1,'b',2)

select top 8000 identity(int,0,1) id into #a from sysobjects a,sysobjects
declare @开始时间 datetime,@结束时间 datetime
select @开始时间='2003-09-20',@结束时间='2003-10-15'

declare @sql varchar(8000)

set @sql = 'select min(时间) 时间'
select @sql = @sql + ',sum(case b.name when '''+name+''' then c.Value else 0 end) ['+name+']'
from (select distinct name from #T1) as a
set @sql=@sql+'from (select dateadd(day,id,'''+CONVERT(varchar(10),@开始时间,120)+''') 时间 from #a where dateadd(day,id,'''+CONVERT(varchar(10),@开始时间,120)+''')<'''+CONVERT(varchar(10),@结束时间,120)+''') a left join #T1 b on a.时间=b.[date] left join #T2 c on c.name=b.name and c.id=b.id group by datediff(week,a.时间,getdate()) order by min(时间)'
exec(@sql)


go
drop table #t1,#t2,#a
wolfpzp 2003-10-08
  • 打赏
  • 举报
回复
大力大哥,还是有点小问题
为什么结果变成了:
[时间] a b
2003-09-21 25 0
2003-09-28 15 2
2003-10-05 12 0
而不是:
[时间] a b
2003-09-20 0 0
2003-09-21 25 0
2003-09-28 15 2
2003-10-05 12 0
2003-10-12 0 0
pengdali 2003-10-08
  • 打赏
  • 举报
回复
CREATE TABLE #T1(
Name NVARCHAR ( 100 ),
Date DATETIME
)

insert #T1 values('a','2003-09-29')
insert #T1 values('a','2003-09-28')
insert #T1 values('a','2003-09-30')
insert #T1 values('a','2003-10-01')
insert #T1 values('a','2003-10-06')
insert #T1 values('a','2003-10-05')
insert #T1 values('a','2003-09-27')
insert #T1 values('a','2003-09-26')
insert #T1 values('a','2003-09-25')
insert #T1 values('a','2003-09-24')
insert #T1 values('a','2003-09-23')
insert #T1 values('b','2003-09-28')

CREATE TABLE #T2(
Name NVARCHAR ( 100 ),
Value int DEFAULT 0
)

insert #T2 values('a',3)
insert #T2 values('a',2)
insert #T2 values('a',4)
insert #T2 values('a',6)
insert #T2 values('a',6)
insert #T2 values('a',6)
insert #T2 values('a',7)
insert #T2 values('a',8)
insert #T2 values('a',7)
insert #T2 values('a',3)
insert #T2 values('a',7)
insert #T2 values('b',2)

select top 1000 identity(int,0,1) id into #a from sysobjects
declare @开始时间 datetime,@结束时间 datetime
select @开始时间='2003-09-20',@结束时间='2003-10-15'

declare @sql varchar(8000)
set @sql = 'select min(时间) 时间'
select @sql = @sql + ',sum(case b.name when '''+name+''' then c.Value else 0 end) ['+name+']'
from (select distinct name from #T1) as a
set @sql=@sql+'from (select dateadd(day,id,'''+CONVERT(varchar(10),@开始时间,120)+''') 时间 from #a where dateadd(day,id,'''+CONVERT(varchar(10),@开始时间,120)+''')<'''+CONVERT(varchar(10),@结束时间,120)+''') a left join #T1 b on a.时间=b.[date] join #T2 c on c.name=b.name group by datediff(week,a.时间,getdate()) order by min(时间)'
exec(@sql)


go
drop table #t1,#t2
wolfpzp 2003-10-08
  • 打赏
  • 举报
回复
我用的语句是这样的:
select top 1000 identity(int,0,1) id into #a from sysobjects
declare @开始时间 datetime,@结束时间 datetime
select @开始时间='2003-09-20',@结束时间='2003-10-15'

declare @sql varchar(8000)
set @sql = 'select min(时间) 时间'
select @sql = @sql + ',sum(case name when '''+name+''' then c.Value else 0 end) ['+name+']'
from (select distinct name from #T1) as a
exec(@sql+'from (select dateadd(day,id,'''+CONVERT(varchar(10),@开始时间,120)+''') 时间 from #a where dateadd(day,id,'''+CONVERT(varchar(10),@开始时间,120)+''')<'''+CONVERT(varchar(10),@结束时间,120)+''') a left join #T1 b on a.时间=b.[date] join #T2 c on c.name=b.name group by datediff(week,a.时间,getdate()) order by min(时间)')
wolfpzp 2003-10-08
  • 打赏
  • 举报
回复
大力大哥,我用的是这两个表:
CREATE TABLE #T1(
Name NVARCHAR ( 100 ),
Date DATETIME
)

insert #T1 values('a','2003-09-29')
insert #T1 values('a','2003-09-28')
insert #T1 values('a','2003-09-30')
insert #T1 values('a','2003-10-01')
insert #T1 values('a','2003-10-06')
insert #T1 values('a','2003-10-05')
insert #T1 values('a','2003-09-27')
insert #T1 values('a','2003-09-26')
insert #T1 values('a','2003-09-25')
insert #T1 values('a','2003-09-24')
insert #T1 values('a','2003-09-23')
insert #T1 values('b','2003-09-28')

CREATE TABLE #T2(
Name NVARCHAR ( 100 ),
Value int DEFAULT 0
)

insert #T2 values('a',3)
insert #T2 values('a',2)
insert #T2 values('a',4)
insert #T2 values('a',6)
insert #T2 values('a',6)
insert #T2 values('a',6)
insert #T2 values('a',7)
insert #T2 values('a',8)
insert #T2 values('a',7)
insert #T2 values('a',3)
insert #T2 values('a',7)
insert #T2 values('b',2)

好象还是不行啊
pengdali 2003-10-08
  • 打赏
  • 举报
回复
declare @sql varchar(8000)
set @sql = 'select min(时间) 时间'
select @sql = @sql + ',sum(case name when '''+name+''' then c.Value else 0 end) ['+name+']'
from (select distinct name from #Num) as a
exec(@sql+'from (select dateadd(day,id,'''+CONVERT(varchar(10),@开始时间,120)+''') 时间 from #a where dateadd(day,id,'''+CONVERT(varchar(10),@开始时间,120)+''')<'''+CONVERT(varchar(10),@结束时间,120)+''') a left join #num b on a.时间=b.[date] join #t2 c on c.id=b.id group by datediff(week,a.时间,getdate()) order by min(时间)')
go


注意改的的地方是加了: join #t2c on ... 和 then c.Value else 0
pengdali 2003-10-08
  • 打赏
  • 举报
回复
declare @sql varchar(8000)
set @sql = 'select min(时间) 时间'
select @sql = @sql + ',sum(case name when '''+name+''' then c.Value else 0 end) ['+name+']'
from (select distinct name from #Num) as a

set @sql=@sql+'from (select dateadd(day,id,'''+CONVERT(varchar(10),@开始时间,120)+''') 时间 from #a where dateadd(day,id,'''+CONVERT(varchar(10),@开始时间,120)+''')<'''+CONVERT(varchar(10),@结束时间,120)+''') a left join #num b on a.时间=b.[date] join #t2 c on c.id=b.id
group by datediff(week,a.时间,getdate()) order by min(时间)'

exec(@sql)
go
wolfpzp 2003-10-08
  • 打赏
  • 举报
回复
如果我在表T1:
CREATE TABLE T1(
ID int,
Date DATETIME
)
表T2:
CREATE TABLE T2(
ID int,
Value int DEFAULT 0
)
其中T1.ID = T2.ID
该如何显示这样的结果呢?
[时间] a b
2003-09-20 0 0
2003-09-21 25 0
2003-09-28 15 2
2003-10-05 12 0
2003-10-12 0 0

我试了半天一直没成功,请大力大哥再帮小弟一下,谢谢!
pengdali 2003-10-08
  • 打赏
  • 举报
回复
CREATE PROCEDURE GetStat
(
@开始时间 DATETIME,
@结束时间 DATETIME
)
AS
BEGIN
select top 365 identity(int,0,1) id into #a from sysobjects a,sysobjects

declare @sql varchar(8000)
set @sql = 'select CONVERT(varchar(10),min(时间),120) 时间'
select @sql = @sql + ',sum(case c.ProductCode when '''+ProductCode+''' then c.OutQty else 0 end) ['+ProductCode+']'
from (select distinct ProductCode from TSalesOrderItem) as a

set @sql=@sql+'from (select dateadd(day,id,'''+CONVERT(varchar(10),@开始时间,120)+''') 时间 from #a where dateadd(day,id,'''+CONVERT(varchar(10),@开始时间,120)+''')<='''+CONVERT(varchar(10),@结束时间,120)+''') a left join TSalesOrder b on CONVERT(varchar(10),a.时间,120)=CONVERT(varchar(10),b.OutStockDate,120) left join TSalesOrderItem c on c.OrderID=b.PKID group by datediff(week,a.时间,getdate()) order by min(时间)'


drop table #a

END
go
wolfpzp 2003-10-08
  • 打赏
  • 举报
回复
大力大哥,再问一个比较简单的问题,如何把它写成存储过程的形式,传进去两个参数:开始时间,结束时间
我刚才这样写会出错:
CREATE PROCEDURE GetStat
(
@开始时间 DATETIME,
@结束时间 DATETIME
)
AS
BEGIN
select top 8000 identity(int,0,1) id into #a from sysobjects a,sysobjects

declare @sql varchar(8000)
set @sql = 'select CONVERT(varchar(10),min(时间),120) 时间'
select @sql = @sql + ',sum(case c.ProductCode when '''+ProductCode+''' then c.OutQty else 0 end) ['+ProductCode+']'
from (select distinct ProductCode from TSalesOrderItem) as a

set @sql=@sql+'from (select dateadd(day,id,'''+CONVERT(varchar(10),@开始时间,120)+''') 时间 from #a where dateadd(day,id,'''+CONVERT(varchar(10),@开始时间,120)+''')<='''+CONVERT(varchar(10),@结束时间,120)+''') a left join TSalesOrder b on CONVERT(varchar(10),a.时间,120)=CONVERT(varchar(10),b.OutStockDate,120) left join TSalesOrderItem c on c.OrderID=b.PKID group by datediff(week,a.时间,getdate()) order by min(时间)'

go
drop table #a

END
wolfpzp 2003-09-30
  • 打赏
  • 举报
回复
太感谢大力大哥了
问题已经全部解决了
pengdali 2003-09-30
  • 打赏
  • 举报
回复
CREATE TABLE #Num(
Name NVARCHAR ( 100 ),
Date DATETIME,
Value int DEFAULT 0
)

insert #num values('a','2003-09-29',3)
insert #num values('a','2003-09-28',2)
insert #num values('a','2003-09-30',4)
insert #num values('a','2003-10-01',6)
insert #num values('a','2003-10-06',6)
insert #num values('a','2003-10-05',6)
insert #num values('a','2003-09-27',7)
insert #num values('a','2003-09-26',8)
insert #num values('a','2003-09-25',7)
insert #num values('a','2003-09-24',3)
insert #num values('a','2003-09-23',7)
insert #num values('b','2003-09-28',2)

select top 1000 identity(int,0,1) id into #a from sysobjects

declare @开始时间 datetime,@结束时间 datetime
select @开始时间='2003-09-20',@结束时间='2003-10-15'

declare @sql varchar(8000)
set @sql = 'select min(时间) 时间'
select @sql = @sql + ',sum(case name when '''+name+''' then Value else 0 end) ['+name+']'
from (select distinct name from #Num) as a

set @sql=@sql+'from (select dateadd(day,id,'''+CONVERT(varchar(10),@开始时间,120)+''') 时间 from #a where dateadd(day,id,'''+CONVERT(varchar(10),@开始时间,120)+''')<'''+CONVERT(varchar(10),@结束时间,120)+''') a left join #num b on a.时间=b.[date] group by datediff(week,a.时间,getdate()) order by min(时间)'

exec(@sql)
go

go
drop table #num,#a
wolfpzp 2003-09-30
  • 打赏
  • 举报
回复
如何查询呢?
wolfpzp 2003-09-30
  • 打赏
  • 举报
回复
谢谢大力大哥
如果我只想通过条件
[DATE] between '2003-09-20' and '2003-10-15'
查询这样的结果:
[时间] a b
2003-09-20 0 0
2003-09-21 25 0
2003-09-28 15 2
2003-10-05 12 0
2003-10-12 0 0
txlicenhe 2003-09-30
  • 打赏
  • 举报
回复
把大力稍改一下:
CREATE TABLE #Num(
Name NVARCHAR ( 100 ),
Date DATETIME,
Value int DEFAULT 0
)

insert #num values('a','2003-09-29',3)
insert #num values('a','2003-09-28',2)
insert #num values('a','2003-09-30',4)
insert #num values('a','2003-10-01',6)
insert #num values('a','2003-10-06',6)
insert #num values('a','2003-10-05',6)
insert #num values('a','2003-09-27',7)
insert #num values('a','2003-09-26',8)
insert #num values('a','2003-09-25',7)
insert #num values('a','2003-09-24',3)
insert #num values('a','2003-09-23',7)
insert #num values('b','2003-09-28',2)

declare @开始时间 datetime,@结束时间 datetime
select @开始时间='2003-09-24',@结束时间='2003-10-05'



declare @sql varchar(8000)
set @sql = 'select name'
select @sql = @sql + ',sum(case when datediff(week,[date],'''+CONVERT(varchar(10),[date],120)+''')=0 then Value else 0 end) ['+CONVERT(varchar(10),[date],120)+']'
from (select top 8000 min([date]) [date] from #num where [Date] between @开始时间 and dateadd(week,1,@结束时间) group by datediff(week,[date],getdate()) order by min([date])) as a
select @sql = @sql+
' from #num where [date] between '''+CONVERT(varchar(10),@开始时间,120)+''' and '''+CONVERT(varchar(10),@结束时间,120)+''' group by name'

exec(@sql)
go

go
drop table #num
pengdali 2003-09-30
  • 打赏
  • 举报
回复
CREATE TABLE #Num(
Name NVARCHAR ( 100 ),
Date DATETIME,
Value int DEFAULT 0
)

insert #num values('a','2003-09-29',3)
insert #num values('a','2003-09-28',2)
insert #num values('a','2003-09-30',4)
insert #num values('a','2003-10-01',6)
insert #num values('a','2003-10-06',6)
insert #num values('a','2003-10-05',6)
insert #num values('a','2003-09-27',7)
insert #num values('a','2003-09-26',8)
insert #num values('a','2003-09-25',7)
insert #num values('a','2003-09-24',3)
insert #num values('a','2003-09-23',7)
insert #num values('b','2003-09-28',2)

select top 1000 identity(int,0,1) id into #a from sysobjects

declare @开始时间 datetime,@结束时间 datetime
select @开始时间='2003-09-24',@结束时间='2003-10-15'
select min(时间) from (
select dateadd(day,id,@开始时间) 时间 from #a where dateadd(day,id,@开始时间)<@结束时间) tem
group by datediff(week,时间,getdate())


declare @sql varchar(8000)
set @sql = 'select name'
select @sql = @sql + ',sum(case when datediff(week,[date],'''+CONVERT(varchar(10),[date],120)+''')=0 then Value else 0 end) ['+CONVERT(varchar(10),[date],120)+']'
from (select top 8000 min(时间) [date] from (select dateadd(day,id,@开始时间) 时间 from #a where dateadd(day,id,@开始时间)<@结束时间) tem group by datediff(week,时间,getdate()) order by min(时间)) as a
select @sql = @sql+' from #num where [date] between '''+CONVERT(varchar(10),@开始时间,120)+''' and '''+CONVERT(varchar(10),@结束时间,120)+''' group by name'

exec(@sql)
go

go
drop table #num,#a
wolfpzp 2003-09-30
  • 打赏
  • 举报
回复
大力大哥,快差不多了,只是还有点问题
我如果select @开始时间='2003-09-24',@结束时间='2003-10-15'
查询出来的结果是:
NAME [2003-09-24] [2003-09-28] [2003-10-05]
a 25 15 12
b 0 2 0
而我想要的结果是:
NAME [2003-09-24] [2003-09-28] [2003-10-05] [2003-10-12]
a 25 15 12 0
b 0 2 0 0

pengdali 2003-09-29
  • 打赏
  • 举报
回复
CREATE TABLE #Num(
Name NVARCHAR ( 100 ),
Date DATETIME,
Value int DEFAULT 0
)

insert #num values('a','2003-09-29',3)
insert #num values('a','2003-09-28',2)
insert #num values('a','2003-09-30',4)
insert #num values('a','2003-10-01',6)
insert #num values('a','2003-10-06',6)
insert #num values('a','2003-10-05',6)
insert #num values('a','2003-09-27',7)
insert #num values('a','2003-09-26',8)
insert #num values('a','2003-09-25',7)
insert #num values('a','2003-09-24',3)
insert #num values('a','2003-09-23',7)
insert #num values('b','2003-09-28',2)

declare @开始时间 datetime,@结束时间 datetime
select @开始时间='2003-09-24',@结束时间='2003-10-05'



declare @sql varchar(8000)
set @sql = 'select name'
select @sql = @sql + ',sum(case when datediff(week,[date],'''+CONVERT(varchar(10),[date],120)+''')=0 then Value else 0 end) ['+CONVERT(varchar(10),[date],120)+']'
from (select top 8000 min([date]) [date] from #num where [Date] between @开始时间 and @结束时间 group by datediff(week,[date],getdate()) order by min([date])) as a
select @sql = @sql+
' from #num where [date] between '''+CONVERT(varchar(10),@开始时间,120)+''' and '''+CONVERT(varchar(10),@结束时间,120)+''' group by name'

exec(@sql)
go

go
drop table #num
wolfpzp 2003-09-29
  • 打赏
  • 举报
回复
这时候考虑的是:
2003-09-19(星期五) —— 2003-09-20(星期六) 在一周之内
2003-09-21(星期日) —— 2003-09-27(星期六) 在一周之内
2003-09-28(星期日) —— 2003-10-04(星期六) 在一周之内
2003-10-05(星期日) —— 2003-10-10(星期六) 在一周之内
wolfpzp 2003-09-29
  • 打赏
  • 举报
回复
还是不是这个意思,因为我查询的时间段是不定的
比如我查询的时间是从2003-09-19到2003-10-05
那么结果就应该是:
NAME [2003-09-19] [2003-09-21] [2003-09-28] [2003-10-05]
a 0 32 15 6
b 0 2 0 0
加载更多回复(4)

34,590

社区成员

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

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