0

次の構造を持つ 2 つのテーブルがあります。

DECLARE @Table1 TABLE
(
    IdColumn INT,
    DateColumn DATETIME 
)

DECLARE @Table2 TABLE
(
    IdColumn INT,
    DateColumn DATETIME,
    Value NUMERIC(18,2)
)

私がしたいのは、テーブル1の日付がそれ以下か等しいテーブル2から最新の値を取得することです。

これは私が構築するクエリです:

SET NOCOUNT ON

DECLARE @Table1 TABLE
(
    IdColumn INT,
    DateColumn DATETIME 
)

DECLARE @Table2 TABLE
(
    IdColumn INT,
    DateColumn DATETIME,
    Value NUMERIC(18,2)
)


DECLARE @RefDate DATETIME='2012-09-01'
DECLARE @NMonths INT
DECLARE @MonthsCounter INT=1

SELECT @NMonths=DATEDIFF(MM,'2012-09-01','2013-03-01')


WHILE @MonthsCounter<=@NMonths  
BEGIN

    INSERT INTO @Table1
    SELECT 1,@RefDate

    SET @RefDate=DATEADD(MM,1,@RefDate);
    SET @MonthsCounter+=1;

END

INSERT @Table2

SELECT 1,'2012-09-01',1000
UNION
SELECT 1,'2012-12-01',5000
UNION
SELECT 1,'2013-01-01',3000



SELECT
T1.IdColumn,
T1.DateColumn,
T2.Value
FROM @Table1 T1

LEFT JOIN @Table2 T2
ON T2.IdColumn=T1.IdColumn AND T1.DateColumn>=t2.DateColumn

問題は、新しい値に最近の日付が含まれている場合、その日付までのすべての値を取得することです。

IdColumn    DateColumn              Value
----------- ----------------------- ---------------------------------------
1           2012-09-01 00:00:00.000 1000.00
1           2012-10-01 00:00:00.000 1000.00
1           2012-11-01 00:00:00.000 1000.00
1           2012-12-01 00:00:00.000 1000.00
1           2012-12-01 00:00:00.000 5000.00
1           2013-01-01 00:00:00.000 1000.00
1           2013-01-01 00:00:00.000 5000.00
1           2013-01-01 00:00:00.000 3000.00
1           2013-02-01 00:00:00.000 1000.00
1           2013-02-01 00:00:00.000 5000.00
1           2013-02-01 00:00:00.000 3000.00

目的の出力は次のとおりです。

IdColumn    DateColumn              Value
----------- ----------------------- ---------------------------------------
1           2012-09-01 00:00:00.000 1000.00
1           2012-10-01 00:00:00.000 1000.00
1           2012-11-01 00:00:00.000 1000.00
1           2012-12-01 00:00:00.000 5000.00
1           2013-01-01 00:00:00.000 3000.00
1           2013-02-01 00:00:00.000 3000.00

どうすればこれを解決できますか?

ありがとう。

4

3 に答える 3

2

ゴードンの回答を正しい構文で投稿しています:

select t1.*,
       (select top 1 value
        from @table2 t2
        where t2.IdColumn = t1.IdColumn and
              t2.DateColumn <= t1.DateColumn
        order by t2.DateColumn desc
       ) t2value
from @table1 t1
于 2013-07-30T12:47:23.237 に答える
1

相関サブクエリを使用してこれを行います。

select t1.*,
       (select top 1 value
        from @table2 t2
        where t2.idColumn = t1.idColumn and
              t2.dateColumn <= t1.dateColumn
        order by t2.dateColumn desc
       ) t2value
from @table1 t1;
于 2013-07-30T12:33:00.337 に答える
0

After comment, try this:

INSERT INTO #Table1 (IdColumn, DateColumn)
SELECT IdColumn, DateColumn
FROM #Table2 t
WHERE NOT EXISTS
    (
        SELECT 'X'
        FROM #Table2 tcopy
        where t.IdColumn = tcopy.IdColumn
        and convert(date, t.DateColumn) = convert(date, tcopy.DateColumn)
        and tCopy.DateColumn > t.DateColumn
    )

I used ">" because you told me, there are no rows with the same date/time in your table2

于 2013-07-30T13:14:31.577 に答える