首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

请问SQL按日期排列连续显示有关问题

2012-12-14 
请教SQL按日期排列连续显示问题有以下表数据。里面的日期是不连贯的,断断续续的。现需求如下,按日期显示数据

请教SQL按日期排列连续显示问题
有以下表数据。里面的日期是不连贯的,断断续续的。
现需求如下,按日期显示数据。表里面没有的日期也是显示出来,金额显示为0。
求指点SQL写法,谢谢各位!

例如原始数据如下:

城市   金额      日期
广州   20000    06-20
广州   30000   06-22
广州   23000   06-24
广州   5000    06-28

希望结果如下:

城市   金额      日期
广州   20000   06-20
广州   0         06-21
广州   20000    06-22
广州   0          06-23
广州   23000   06-24
广州   0          06-25
广州   0          06-26
广州   0          06-27
广州   5000    06-28
[最优解释]


create table cb
(城市 varchar(6),
 金额 int,
 日期 varchar(6))
 
insert into cb 
 select '广州', '20000', '06-20' union all
 select '广州', '30000', '06-22' union all
 select '广州', '23000', '06-24' union all
 select '广州', '5000', '06-28'


select isnull(b.城市,'广州') '城市',
       isnull(b.金额,0) '金额',
       a.qd '日期'
from
(select right(convert(varchar,dateadd(d,number,
        (select '2012-'+min(日期) from cb)),23),5) 'qd'
 from master.dbo.spt_values
 where [type]='P' and number<=
 (select datediff(d,'2012-'+min(日期),'2012-'+max(日期)) from cb)
) a
left join cb b on a.qd=b.日期
 
/*
城市     金额         日期
------ ----------- ----------
广州     20000       06-20
广州     0           06-21
广州     30000       06-22
广州     0           06-23
广州     23000       06-24
广州     0           06-25
广州     0           06-26
广州     0           06-27
广州     5000        06-28

(9 row(s) affected)
*/

[其他解释]
--日期表
declare @begindate date='2012-6-1'
declare @enddate date='2012-6-30'
declare @datetb(DT date)
while @begindate<=@enddate
begin
insert into @datetb
select @begindate
set @begindate=@begindate+1
end
--查询
select b.城市,isnull(b.金额,0),a.DT 日期
from @datetb as a left join tablename as b on a.DT=b.日期


[其他解释]



--改了下
CREATE TABLE t3
(
id INT IDENTITY(1,1),
City VARCHAR(50),
Salary INT ,
CreateDate DATETIME
)

INSERT INTO t3 VALUES ('广州',5000,GETDATE()-1)
INSERT INTO t3 VALUES ('广州',6000,GETDATE()-3)
INSERT INTO t3 VALUES ('广州',7000,GETDATE()-5)

SELECT * FROM t3


CREATE TABLE t4
(
id INT IDENTITY(1,1),
City VARCHAR(50),
Salary INT ,
CreateDate DATETIME
)



DECLARE @i INT
SET @i=0
DECLARE @currentDate DATETIME
WHILE @i <30
BEGIN

SET @currentDate = DATEADD(mm, DATEDIFF(mm,0,getdate()), 0)+@i;
IF EXISTS(SELECT * FROM t3 WHERE  CONVERT(varchar(100), createDate, 23) =@currentDate)
BEGIN
INSERT INTO t4  SELECT city,Salary, CONVERT(varchar(100), createDate, 23) FROM t3 WHERE  CONVERT(varchar(100), createDate, 23) =@currentDate
END
ELSE
BEGIN
INSERT INTO t4 VALUES ('广州',0,@currentDate)
END
SET @i=@i+1
END


select * from t4




[其他解释]
这个应该可以实现的,用FOR?
[其他解释]


CREATE TABLE t3
(
id INT IDENTITY(1,1),
City VARCHAR(50),
Salary INT ,
CreateDate DATETIME
)

INSERT INTO t3 VALUES ('广州',5000,GETDATE()-1)
INSERT INTO t3 VALUES ('广州',6000,GETDATE()-3)
INSERT INTO t3 VALUES ('广州',7000,GETDATE()-5)

SELECT * FROM t3

CREATE TABLE t4
(
id int,
City VARCHAR(50),
Salary INT ,
CreateDate DATETIME
)



DECLARE @i INT
SET @i=0
DECLARE @currentDate DATETIME
WHILE @i <30
BEGIN

SET @currentDate = DATEADD(mm, DATEDIFF(mm,0,getdate()), 0)+@i;
IF EXISTS(SELECT * FROM t3 WHERE  CONVERT(varchar(100), createDate, 23) =@currentDate)
BEGIN
INSERT INTO t4  SELECT * FROM t3 WHERE  CONVERT(varchar(100), createDate, 23) =@currentDate
END
ELSE
BEGIN
INSERT INTO t4 VALUES ((SELECT ISNULL(MAX(id),1) FROM t4),'',0,@currentDate)
END
SET @i=@i+1
END





热点排行