0
date,               product,   new_col,
2013/05/16,            A,
2013/05/18,            A,
2013/06/15,            A,
2013/05/16,            B,
2013/06/13,            B,
2013/06/20,            B

SQL Server 2008 を使用しています。

既存のエントリごとに、列の日付までの 5 つの前のカレンダー日付new_colに格納する必要があります。たとえば、上の表の 1 行目では、.new_coldate5/16,5/15,5/14,5/13,5/12new_col

テーブルには多くの製品があり、すべての製品に多くの日付があります。

これらの 2 つの列に基づいてテーブルを分割しようとしましたが、 に 5 日を入力する方法がわかりませんnew_col

これを行うための提案を手伝ってください。

4

2 に答える 2

0

これが最善の解決策かどうかはわかりませんが、頭に浮かんだ最初の解決策です。また、人々が言及しているように、これを保存する必要はありません...展開したレポートソリューションから直接この関数を呼び出すことができます。最後のコンマを削除するのが面倒でしたが、それは非常に簡単です。また、必要に応じて日時の書式を自由に調整してください。

CREATE TABLE dbo.Sam ([Date] DATE, Product VARCHAR(10), NewCol VARCHAR(1000))
INSERT INTO dbo.Sam
SELECT '2013/05/16','A',NULL
UNION ALL SELECT '2013/05/18','A',NULL
UNION ALL SELECT '2013/06/15','A',NULL
UNION ALL SELECT '2013/05/16','B',NULL
UNION ALL SELECT '2013/06/13','B',NULL
UNION ALL SELECT '2013/06/20','B',NULL

GO


CREATE FUNCTION dbo.fnGet4PreviousDates(@Date DATE, @Product VARCHAR(10))
    RETURNS VARCHAR(1000)
AS
BEGIN

    DECLARE @Out VARCHAR(1000) = ''


    SELECT @Out = @Out + CONVERT(VARCHAR,[Date],112) + ','
    FROM (
        SELECT TOP 5 [Date]
        FROM dbo.Sam
        WHERE Product = @Product
        AND [Date] < @Date
        ORDER BY [Date] DESC
    ) t

    RETURN @Out

END
GO

UPDATE dbo.Sam
SET NewCol = dbo.fnGet4PreviousDates([Date],Product)

SELECT * FROM dbo.Sam
于 2013-10-04T13:39:34.357 に答える