请教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