关于分组排序问题

xs52121 2009-08-24 11:40:20
我的表如下:
'2009-08-01 01:34:35',235
'2009-08-05 02:26:24',245
'2009-08-05 02:56:54',245
'2009-09-05 03:55:04',256
'2009-09-06 03:55:04',235
'2009-08-06',779
有两列一列是时间,一列是值,这些值中有很多是相同的


我的想做的是,筛选出的数据第一列的时间上面表有的都正常显示,没有的每天补一条空记录,保证每天的时间是连续的。并按照第二列分组显示。按时间排序。如果简单按第一列也分组没有记录的那天就空了。

想得到结果:

'2009-08-01 01:34:35',235
'2009-08-02 00:00:00,null
'2009-08-03 00:00:00,null
'2009-08-04 00:00:00,null
'2009-08-05 02:26:24',245
'2009-08-05 02:56:54',245
'2009-08-06',779
.....(时间是同2009-08-06到2009-09-04中间是连续的,第二列值都为空)
'2009-09-05 03:55:04',256
'2009-09-06 03:55:04',235
...全文
217 47 打赏 收藏 转发到动态 举报
写回复
用AI写文章
47 条回复
切换为时间正序
请发表友善的回复…
发表回复
feixianxxx 2009-08-24
  • 打赏
  • 举报
回复
select p.date,k.TestforData
from
(select * from dbo.F_DATELIST ('2009-08-06','2009-09-04')) as p
left join TestData as k
on datediff(day,p.date,k.TestTime)=0

这样 这样。。。
feixianxxx 2009-08-24
  • 打赏
  • 举报
回复
--功能:返回两个日期间的时间列表
IF EXISTS (SELECT 1 FROM [dbo].SYSOBJECTS WHERE NAME = 'F_DATELIST ')
DROP FUNCTION F_DATELIST
GO
CREATE FUNCTION F_DATELIST
(
@BEGIN_DATE AS DATETIME,
@END_TIME AS DATETIME
) RETURNS @TEMPTABLE TABLE (DATE DATETIME )
AS
BEGIN
WHILE(datediff(day,@BEGIN_DATE , @END_TIME)>=0)
BEGIN
INSERT INTO @TEMPTABLE(DATE)
VALUES(@BEGIN_DATE)
SET @BEGIN_DATE=dateadd(day,1,@BEGIN_DATE)
END
RETURN
END
GO
select p.date,k.TestforData
from
(select * from dbo.F_DATELIST ('2009-08-06','2009-09-04')) as p
join TestData as k
on datediff(day,p.date,k.TestTime)=0
feixianxxx 2009-08-24
  • 打赏
  • 举报
回复
[Quote=引用 30 楼 xs52121 的回复:]
引用 29 楼 feixianxxx 的回复:
引用 27 楼 xs52121 的回复:
引用 26 楼 feixianxxx 的回复:
。。。。。

你仔细看看 ,
TestData的日期列名 是DATETIME类型?


14楼少了个),加上执行成功,在执行15楼抱错,
Msg 102, Level 15, State 1, Line 3
Incorrect syntax near ' '.
Msg 102, Level 15, State 1, Line 5
Incorrect syntax near 'k'.

我的日期列是DateTime的


14楼的 可以执行 就好了
15楼有半角

14楼的跑完每数据啊
[/Quote]


--功能:返回两个日期间的时间列表
IF EXISTS (SELECT 1 FROM [dbo].SYSOBJECTS WHERE NAME = 'F_DATELIST ')
DROP FUNCTION F_DATELIST
GO
CREATE FUNCTION F_DATELIST
(
@BEGIN_DATE AS DATETIME,
@END_TIME AS DATETIME
) RETURNS @TEMPTABLE TABLE (DATE DATETIME )
AS
BEGIN
WHILE(datediff(day,@BEGIN_DATE , @END_TIME)>=0)
BEGIN
INSERT INTO @TEMPTABLE(DATE)
VALUES(@BEGIN_DATE)
SET @BEGIN_DATE=dateadd(day,1,@BEGIN_DATE)
END
RETURN
END
GO
select p.date,k.TestforData
from
(select * from dbo.F_DATELIST ('2009-08-06','2009-09-04')) as p
join TestData as k

这样去试试
on datediff(day,p.date,k.TestTime)=0
xs52121 2009-08-24
  • 打赏
  • 举报
回复
[Quote=引用 29 楼 feixianxxx 的回复:]
引用 27 楼 xs52121 的回复:
引用 26 楼 feixianxxx 的回复:
。。。。。

你仔细看看 ,
TestData的日期列名 是DATETIME类型?


14楼少了个),加上执行成功,在执行15楼抱错,
Msg 102, Level 15, State 1, Line 3
Incorrect syntax near ' '.
Msg 102, Level 15, State 1, Line 5
Incorrect syntax near 'k'.

我的日期列是DateTime的


14楼的 可以执行 就好了
15楼有半角
[/Quote]
14楼的跑完每数据啊
feixianxxx 2009-08-24
  • 打赏
  • 举报
回复
[Quote=引用 27 楼 xs52121 的回复:]
引用 26 楼 feixianxxx 的回复:
。。。。。

你仔细看看 ,
TestData的日期列名 是DATETIME类型?


14楼少了个),加上执行成功,在执行15楼抱错,
Msg 102, Level 15, State 1, Line 3
Incorrect syntax near ' '.
Msg 102, Level 15, State 1, Line 5
Incorrect syntax near 'k'.

我的日期列是DateTime的
[/Quote]

14楼的 可以执行 就好了
15楼有半角
xs52121 2009-08-24
  • 打赏
  • 举报
回复
我的表名TestData,
列:
ID int 自增
TestTime DateTime
TestforData nvarchar(12)
xs52121 2009-08-24
  • 打赏
  • 举报
回复
[Quote=引用 26 楼 feixianxxx 的回复:]
。。。。。

你仔细看看 ,
TestData的日期列名 是DATETIME类型?
[/Quote]

14楼少了个),加上执行成功,在执行15楼抱错,
Msg 102, Level 15, State 1, Line 3
Incorrect syntax near ' '.
Msg 102, Level 15, State 1, Line 5
Incorrect syntax near 'k'.

我的日期列是DateTime的
feixianxxx 2009-08-24
  • 打赏
  • 举报
回复
。。。。。

你仔细看看 ,
TestData的日期列名 是DATETIME类型?
xs52121 2009-08-24
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 feixianxxx 的回复:]
引用 23 楼 xs52121 的回复:
引用 19 楼 feixianxxx 的回复:
引用 18 楼 xs52121 的回复:
引用 15 楼 feixianxxx 的回复:
SQL codedeclare@btdatetime,@etdatetime,@nintset@n=DATEDIFF(DAY,@bt,@et)select k.rq,p.colfrom (selectDATEADD(DAY,number,dateadd(day,-1,@n))as rqfrom  master..spt_valueswhere[type]='P'andnumberbetween1a¡­

Msg 102, Level 15, State 1, Line 3
Incorrect syntax near ' '.
Msg 102, Level 15, State 1, Line 5
Incorrect syntax near 'k'.


14楼的 函数。。。。

14的函数我创建成功了阿,我sql 2005

那你执行
select p.date,k.col2
from (select * from dbo.F_DATELIST ('2009-08-06','2009-09-04' ) as p join TestData as k
on  datediff(day,p.date,k.日期字段)=0
了么
[/Quote]
将日期字段换成,TestData的日期列名,执行后报下面错误:
Msg 102, Level 15, State 1, Line 3
Incorrect syntax near '0'.
feixianxxx 2009-08-24
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 xs52121 的回复:]
引用 19 楼 feixianxxx 的回复:
引用 18 楼 xs52121 的回复:
引用 15 楼 feixianxxx 的回复:
SQL codedeclare@btdatetime,@etdatetime,@nintset@n=DATEDIFF(DAY,@bt,@et)select k.rq,p.colfrom (selectDATEADD(DAY,number,dateadd(day,-1,@n))as rqfrom  master..spt_valueswhere[type]='P'andnumberbetween1a¡­

Msg 102, Level 15, State 1, Line 3
Incorrect syntax near ' '.
Msg 102, Level 15, State 1, Line 5
Incorrect syntax near 'k'.


14楼的 函数。。。。

14的函数我创建成功了阿,我sql 2005
[/Quote]
那你执行
select p.date,k.col2
from (select * from dbo.F_DATELIST ('2009-08-06','2009-09-04' ) as p join TestData as k
on datediff(day,p.date,k.日期字段)=0
了么
xs52121 2009-08-24
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 feixianxxx 的回复:]
引用 18 楼 xs52121 的回复:
引用 15 楼 feixianxxx 的回复:
SQL codedeclare@btdatetime,@etdatetime,@nintset@n=DATEDIFF(DAY,@bt,@et)select k.rq,p.colfrom (selectDATEADD(DAY,number,dateadd(day,-1,@n))as rqfrom  master..spt_valueswhere[type]='P'andnumberbetween1a¡­

Msg 102, Level 15, State 1, Line 3
Incorrect syntax near ' '.
Msg 102, Level 15, State 1, Line 5
Incorrect syntax near 'k'.


14楼的 函数。。。。
[/Quote]
14的函数我创建成功了阿,我sql 2005
feixianxxx 2009-08-24
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 xs52121 的回复:]
引用 17 楼 feixianxxx 的回复:
引用 16 楼 xs52121 的回复:
引用 14 楼 feixianxxx 的回复:
SQL code--功能:返回两个日期间的时间列表IFEXISTS (SELECT1FROM[dbo].SYSOBJECTSWHERE NAME='F_DATELIST')DROPFUNCTION F_DATELISTGOCREATEFUNCTION F_DATELIST 
                (@BEGIN_DATEASDATETIME,@END_TIMEASDATETIME
                )RETURNS@TEMPTABLETABLE (DATEDATETIME )ASBEGINWHILE(datediff(day,@BEGIN_DATE ,@END_TIME)>=0)BEGININSERTINTO@TEMPTABLE(DATE)VALUES(@BEGIN_DATE)SET@BEGIN_DATE=dateadd(day,1,@BEGIN_DATE)ENDRETURNENDGOselect p.date,k.col2from (select*from dbo.F_DATELIST ('2009-08-06','2009-09-04' )as pjoin TestDataas kondatediff(day,p.date,k.日期字段)=0
函数也可以解决

我中间的日期断的很多

没关系的 你试试14 15楼

都抱错啊
[/Quote]
.....14楼 什么错误
guguda2008 2009-08-24
  • 打赏
  • 举报
回复
交给T-MAC,挣了分记得散
xs52121 2009-08-24
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 feixianxxx 的回复:]
引用 16 楼 xs52121 的回复:
引用 14 楼 feixianxxx 的回复:
SQL code--功能:返回两个日期间的时间列表IFEXISTS (SELECT1FROM[dbo].SYSOBJECTSWHERE NAME='F_DATELIST')DROPFUNCTION F_DATELISTGOCREATEFUNCTION F_DATELIST 
                (@BEGIN_DATEASDATETIME,@END_TIMEASDATETIME
                )RETURNS@TEMPTABLETABLE (DATEDATETIME )ASBEGINWHILE(datediff(day,@BEGIN_DATE ,@END_TIME)>=0)BEGININSERTINTO@TEMPTABLE(DATE)VALUES(@BEGIN_DATE)SET@BEGIN_DATE=dateadd(day,1,@BEGIN_DATE)ENDRETURNENDGOselect p.date,k.col2from (select*from dbo.F_DATELIST ('2009-08-06','2009-09-04' )as pjoin TestDataas kondatediff(day,p.date,k.日期字段)=0
函数也可以解决

我中间的日期断的很多

没关系的 你试试14 15楼
[/Quote]
都抱错啊
feixianxxx 2009-08-24
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 xs52121 的回复:]
引用 15 楼 feixianxxx 的回复:
SQL codedeclare@btdatetime,@etdatetime,@nintset@n=DATEDIFF(DAY,@bt,@et)select k.rq,p.colfrom (selectDATEADD(DAY,number,dateadd(day,-1,@n))as rqfrom  master..spt_valueswhere[type]='P'andnumberbetween1a¡­

Msg 102, Level 15, State 1, Line 3
Incorrect syntax near ' '.
Msg 102, Level 15, State 1, Line 5
Incorrect syntax near 'k'.

[/Quote]
14楼的 函数。。。。
xs52121 2009-08-24
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 feixianxxx 的回复:]
SQL codedeclare@btdatetime,@etdatetime,@nintset@n=DATEDIFF(DAY,@bt,@et)select k.rq,p.colfrom (selectDATEADD(DAY,number,dateadd(day,-1,@n))as rqfrom master..spt_valueswhere[type]='P'andnumberbetween1a¡­
[/Quote]
Msg 102, Level 15, State 1, Line 3
Incorrect syntax near ' '.
Msg 102, Level 15, State 1, Line 5
Incorrect syntax near 'k'.
feixianxxx 2009-08-24
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 xs52121 的回复:]
引用 14 楼 feixianxxx 的回复:
SQL code--功能:返回两个日期间的时间列表IFEXISTS (SELECT1FROM[dbo].SYSOBJECTSWHERE NAME='F_DATELIST')DROPFUNCTION F_DATELISTGOCREATEFUNCTION F_DATELIST 
                (@BEGIN_DATEASDATETIME,@END_TIMEASDATETIME
                )RETURNS@TEMPTABLETABLE (DATEDATETIME )ASBEGINWHILE(datediff(day,@BEGIN_DATE ,@END_TIME)>=0)BEGININSERTINTO@TEMPTABLE(DATE)VALUES(@BEGIN_DATE)SET@BEGIN_DATE=dateadd(day,1,@BEGIN_DATE)ENDRETURNENDGOselect p.date,k.col2from (select*from dbo.F_DATELIST ('2009-08-06','2009-09-04' )as pjoin TestDataas kondatediff(day,p.date,k.日期字段)=0
函数也可以解决

我中间的日期断的很多
[/Quote]
没关系的 你试试14 15楼
xs52121 2009-08-24
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 feixianxxx 的回复:]
SQL code--功能:返回两个日期间的时间列表IFEXISTS (SELECT1FROM[dbo].SYSOBJECTSWHERE NAME='F_DATELIST')DROPFUNCTION F_DATELISTGOCREATEFUNCTION F_DATELIST
(@BEGIN_DATEASDATETIME,@END_TIMEASDATETIME
)RETURNS@TEMPTABLETABLE (DATEDATETIME )ASBEGINWHILE(datediff(day,@BEGIN_DATE ,@END_TIME)>=0)BEGININSERTINTO@TEMPTABLE(DATE)VALUES(@BEGIN_DATE)SET@BEGIN_DATE=dateadd(day,1,@BEGIN_DATE)ENDRETURNENDGOselect p.date,k.col2from (select*from dbo.F_DATELIST ('2009-08-06','2009-09-04' )as pjoin TestDataas kondatediff(day,p.date,k.日期字段)=0
函数也可以解决
[/Quote]
我中间的日期断的很多
feixianxxx 2009-08-24
  • 打赏
  • 举报
回复
declare @bt datetime,@et datetime,@n int
set @n=DATEDIFF(DAY,@bt,@et)
select k.rq,p.col
from (select DATEADD(DAY,number,dateadd(day,-1,@n)) as rq
from master..spt_values where [type] = 'P' and number between 1 and @n ) k
left join TestData p on datediff(day,k.rq,p.日期字段)=0
feixianxxx 2009-08-24
  • 打赏
  • 举报
回复
--功能:返回两个日期间的时间列表
IF EXISTS (SELECT 1 FROM [dbo].SYSOBJECTS WHERE NAME = 'F_DATELIST ')
DROP FUNCTION F_DATELIST
GO
CREATE FUNCTION F_DATELIST
(
@BEGIN_DATE AS DATETIME,
@END_TIME AS DATETIME
) RETURNS @TEMPTABLE TABLE (DATE DATETIME )
AS
BEGIN
WHILE(datediff(day,@BEGIN_DATE , @END_TIME)>=0)
BEGIN
INSERT INTO @TEMPTABLE(DATE)
VALUES(@BEGIN_DATE)
SET @BEGIN_DATE=dateadd(day,1,@BEGIN_DATE)
END
RETURN
END
GO
select p.date,k.col2
from (select * from dbo.F_DATELIST ('2009-08-06','2009-09-04' ) as p join TestData as k
on datediff(day,p.date,k.日期字段)=0

函数也可以解决
加载更多回复(27)

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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