2009-12-24 88 views
0

我需要一些帮助来构建SQL查询。我已经有喜欢的数据表:构建SQL查询

ID Date   Value 
1 12/01/2009  4 
2 12/02/2009  3 
3 12/03/2009  6 
4 12/01/2008  2 
5 12/02/2008  4 
6 12/03/2008  5 

这里是我的查询:

select ID, Date, Value from MyTable 
where Date between '12/01/2009' and '12/04/2009' 

,并返回以下行:

ID Date   Value 
1 12/01/2009  4 
2 12/02/2009  3 
3 12/03/2009  6 

但我需要在以下格式的数据:

ID Date   Value lastYearValueANDSameDate 
1 12/01/2009  4    2 
2 12/02/2009  3    4 
3 12/03/2009  6    8 

这里我需要获取lastYearValueANDSameDate列中同一日期的最后一年的值。

感谢

+0

列出的要求并不完整,示例数据集不回答未知问题。看起来你想要的条目最低的ID加在右边的下一个更高的ID条目。那是对的吗? – 2009-12-24 05:58:22

+0

@NickLarson;现在检查,我已经编辑我的问题。你现在有要求吗? – 2009-12-24 06:02:01

+0

@Muhummad,我清理了格式并添加了(我认为是的)你的完整查询(总是一个好主意,包括完整的一个,因为可能有其他的条款在那里改变行为)。请检查查询是否正确,如果不正确,请修复。 – paxdiablo 2009-12-24 06:40:09

回答

1

看一看这个

DECLARE @Table TABLE(
     ID INT, 
     Date DATETIME, 
     Value INT 
) 

INSERT INTO @Table SELECT 1, '12/01/2009', 4 
INSERT INTO @Table SELECT 2, '12/02/2009', 3 
INSERT INTO @Table SELECT 3, '12/03/2009', 6 
INSERT INTO @Table SELECT 4, '12/01/2008', 2 
INSERT INTO @Table SELECT 5, '12/02/2008', 4 
INSERT INTO @Table SELECT 6, '12/03/2008', 5 

SELECT t.ID, 
     t.Date, 
     t.Value, 
     tPrev.Value 
FROM @Table t LEFT JOIN 
     @Table tPrev ON DATEADD(yy, -1, t.Date) = tPrev.Date 
WHERE t.Date between '12/01/2009' AND '12/04/2009' 
+0

@Astander;这是格雷斯的回答,我希望这会对我有用,让我先检查一下。谢谢 – 2009-12-24 06:14:12

+0

@Astander,我发给你一封电子邮件,我需要一些帮助来查询。 Plz回复。谢谢 – 2010-04-01 14:02:53

+0

你有没有把查询放在SO中,我会尽快查看,当我可以尽快 - ) – 2010-04-01 17:04:10

1

未经测试,但我认为它会工作:

select a.id, a.date, a.value, b.value 
from mytable a, mytable b 
where a.date >= '12/01/2009' 
and a.date <= '12/04/2009' 
and a.date = dateadd(year,1,b.date) 

请记住,这是一个笛卡尔乘积(虽然不是一个完整的由于最后一个and子句而交叉连接),所以它不会为没有相应的去年行的日期生成行。

1
DECLARE @Table TABLE(
ID INT, 
Date DATETIME, 
Value INT 
) 

INSERT INTO @Table SELECT 1, '12/01/2009', 4 
INSERT INTO @Table SELECT 2, '12/02/2009', 3 
INSERT INTO @Table SELECT 3, '12/03/2009', 6 
INSERT INTO @Table SELECT 4, '12/01/2008', 2 
INSERT INTO @Table SELECT 5, '12/02/2008', 4 
INSERT INTO @Table SELECT 6, '12/03/2008', 5 


SELECT *,(SELECT TOP 1 Value FROM @Table WHERE Date=DATEADD(YEAR,-1, a.Date)) AS last FROM @Table a 

WHERE a.Date between '12/01/2009' AND '12/04/2009'