2012-04-17 8 views
1

説明が難しく、SQL Serverが最善ではありませんが、ここでは何も行いません。テーブルに現在のレコードと次のレコードの間の列の合計

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

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

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 

そしていくつかのデータを挿入する

私は計算したい現在のQuarterDateQuarterly結果セットの次のレコードの間のQuarterlyテーブル内の各レコードの[値]のSUMをTmpDegreeDaysにします。

何かのように:

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 

はこの理にかなっていますか?

+1

まず、あなたはあなたのINSERTをとても複雑にしていますか? INSERT INTO [dbo]。[Quarterly]([QuarterDate]、[SomeText])VALUES( '20100101'、N'Blah ') 'などを使用しないでください。 **あなたの奇妙なキャスティングよりもずっと簡単です.....:度の値を持つテーブルを持っている場合 - ** WHY **は 'Value'カラムです 'VARCHAR(50)' ??それは 'DECIMAL(10,4)'やそれ以上のもののようなものではいけませんか? Varcharは完全にここでは意味がありません..... –

+0

Marc - それは私のコードではありません。私を信じて、それはもっとうまくいくでしょう。 –

+0

'SUM'は' VARCHAR'列の**仕事でもありません - あなたは間違いなくいくつかのものを変更する必要があります..... –

答えて

1

あなたはこのような何かを試みることができる - 各四半期の日付を見つけるために、(SQL Serverの以降で利用可能)CTEを使用して、度の値を合計:

;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 

奇妙な機能をQuarterEndDateを確認するには、DATETIMEの精度がSQL Serverで3.33msであることに根ざしています。したがって、指定された月の最終日はその月の最終日で、時刻は23:59:59.997(.999ではなく)です。したがって、私は四半期の開始日に3ヶ月を加え、次にこの四半期の最後のミリ秒を得るために次の四半期の開始日から3ミリ秒を引く必要があります。

更新: OK、テーブルからの四半期の開始日と終了日を取得するためには、次の2つのネストされたCTEの「次の四半期の終了日マイナス3ミリ秒の」終わりのためを決定するためには必要ありこのようなもの:

;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 
+0

マーク - 素晴らしい!私はこれがそれだと思う。しかし、1つの問題 - CTEは、元のPROCのはるか遠方にある最終的な結果セットの列(依然としてQuarterDatesテーブルからのみ選択する)に配置する必要があります。最終的な結果セット(いくつかの計算など)に返されるカスタム列が作成されています。それでは、どうやってCTEをSPROCでさらに参照できるのでしょうか? –

+0

マーク - ほぼそこにあります。私が持っている問題はQuarterDateとあなたが追加した3ヶ月です。私はすべての "顧客"が四分の一が(カレンダーテーブルから)何ができるかについて独自の定義を持っているので、これを削除する必要があります。次のデータ行から次のQuarterDateを取得し、それを「終了」として使用する必要があります。何か案は? –

+0

@Ahmedilyas:次のものの開始日を見て、現在の四半期の終了を判断する方法で私の応答を更新しました –

関連する問題