1

説明するのが少し難しく、私のSQL Serverは最高ではありませんが、ここでは何でもできます。

まず、いくつかのテーブルを作成します。

CREATE TABLE [dbo].[Quarterly](
[QuarterDate] [datetime] NOT NULL,
[SomeText] [nvarchar](50) NULL,
CONSTRAINT [PK_Quarterly] PRIMARY KEY CLUSTERED 
(
[QuarterDate] ASC
)
GO

CREATE TABLE [dbo].[TmpDegreeDays](
[Date] [datetime] NOT NULL,
[Value] [nvarchar](50) NOT NULL,
CONSTRAINT [PK_TmpDegreeDays] PRIMARY KEY CLUSTERED 
(
[Date] ASC
)
GO

次に、いくつかのデータを挿入します。

INSERT [dbo].[Quarterly] ([QuarterDate], [SomeText]) VALUES (CAST(0x00009CF100000000 AS DateTime), N'Blah')
INSERT [dbo].[Quarterly] ([QuarterDate], [SomeText]) VALUES (CAST(0x00009D4B00000000 AS DateTime), N'Fools')
INSERT [dbo].[Quarterly] ([QuarterDate], [SomeText]) VALUES (CAST(0x00009DA600000000 AS DateTime), N'Later')
INSERT [dbo].[Quarterly] ([QuarterDate], [SomeText]) VALUES (CAST(0x00009E0400000000 AS DateTime), N'Something')
INSERT [dbo].[Quarterly] ([QuarterDate], [SomeText]) VALUES (CAST(0x00009E5E00000000 AS DateTime), N'New year')
INSERT [dbo].[Quarterly] ([QuarterDate], [SomeText]) VALUES (CAST(0x00009EC300000000 AS DateTime), N'In april')

2010-01-01次に、から(を含む)までの日付範囲2012-03-10をテーブルに挿入しますTmpDegreeDays

ついに:

結果セットの現在のレコードと次のレコードの間のテーブルのTmpDegreeDays各レコードの[値]の合計を計算したいと思います。QuarterlyQuarterDateQuarterly

何かのようなもの:

DECLARE @startDate datetime, @endDate datetime
SET @startDate = '2010-01-01'
SET @endDate = '2010-12-31'

SELECT q.QuarterDate, q.SomeText, CustomSum = 
(SELECT SUM(CAST([Value] AS float))
FROM TmpDegreeDays 
WHERE [date] >= q.QuarterDate AND *Current QuarterDate* < *Some query here to get next row QuarterDate*)

FROM Quarterly q

WHERE q.QuarterDate BETWEEN @startDate AND @endDate

私が探している最終出力の例:

2010-01-01   Sum of [Value] between 2010-01-01 and 2010-03-31
2010-04-01   Sum of [Value] between 2010-04-01 and 2010-06-30
2010-07-01   Sum of [Value] between 2010-07-01 and 2010-09-31
2010-10-03   Sum of [Value] between 2010-10-03 and 2010-10-03

これは意味がありますか?

4

1 に答える 1

1

次のようなことを試すことができます-CTE(SQL Server 2005以降で利用可能)を使用して各四半期の日付を検索し、次の値を合計します。

;WITH QuarterlyDates AS
(        
   SELECT 
       QuarterDate, 
       QuarterEndDate = DATEADD(MILLISECOND, -3, DATEADD(MONTH, 3, QuarterDate))
   FROM [dbo].[Quarterly]
)
SELECT
    qd.QuarterDate, qd.QuarterEndDate,
    DegreeSum = (SELECT SUM(DegreeValue) 
                 FROM [dbo].[TmpDegreeDays] 
                 WHERE [Date] BETWEEN qd.QuarterDate AND qd.QuarterEndDate)
FROM
    QuarterlyDates qd

を決定するための奇妙な関数は、SQLServerでの精度が3.33msであるQuarterEndDateという事実に根ざしています。DATETIMEしたがって、特定の月の最終日はその月の最終日であり、時刻は23:59:59.997(.999ではありません)です。したがって、四半期の開始日に3か月を加算し、次の四半期の開始日から3ミリ秒を減算して、問題の四半期の最後のミリ秒を取得する必要があります。

更新:わかりました。テーブルから四半期の開始日と終了日を取得するには、四半期の終わりの「次の四半期の終了日から3ミリ秒を引いた日」を決定するために2つのネストされたCTEが必要です。これ:

;WITH QuarterStarts AS
(
    SELECT  
        QuarterDate,
        QNumber = ROW_NUMBER() OVER(ORDER BY QuarterDate)   -- ordering number
    FROM [dbo].[Quarterly]
),
Quarters AS
(
    SELECT
        QuarterStartDate = q1.QuarterDate,
        QuarterEndDate = DATEADD(MILLISECOND, -3, q2.QuarterDate) 
    FROM
        QuarterStarts q1
    INNER JOIN 
        QuarterStarts q2 ON q2.QNumber = q1.QNumber + 1 
)
SELECT
    q.QuarterDate, q.QuarterEndDate,
    DegreeSum = (SELECT SUM(DegreeValue) 
                 FROM [dbo].[TmpDegreeDays] 
                 WHERE [Date] BETWEEN q.QuarterDate AND q.QuarterEndDate)
FROM
    Quarters q
于 2012-04-17T21:16:24.803 に答える