构建SQL查询

时间:2009-12-24 05:54:12

标签: sql-server sql

我需要一些帮助来构建SQL Query。我的表有如下数据:

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列中获取同一日期的去年值。

由于

3 个答案:

答案 0 :(得分: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'

答案 1 :(得分: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子句而不是完整的交叉连接),因此它不会为没有相应的去年行的日期生成行。 / p>

答案 2 :(得分: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'