2011-10-10 10 views
5

IDでグループ化された異なるクライアントの2つのテーブルの最終残高を比較する必要があります。テーブルには同じIDがありますが、1つは複数のIDエントリを持ち、もう1つはIDエントリを持ちません。私は複数のエントリを持つテーブルから行を合計する必要があるので、計算を行うには最終的な数値が1つしかありません。共通テーブル式で2つのデータフィールドをグループ化する方法

私はこれを多く行うクエリを持っていますが、今は月単位でグループ化する必要があります。私の現在のクエリは、すべての日付でそれを合計します。実際にIDごとおよび月ごとにデータをソートする必要があるため、各IDの月末残高を把握する必要があります。これまで私が行ったことでこれを行う方法はありますか?

ありがとうございます。

これはこれまで私が行ってきたことです。

-- Data setup 
    CREATE TABLE [Table1] 
    (
     [ID] INT, 
     [cost] INT, 
     [traceNumber] INT, 
     [TheDate] DATE 
    ) 

    INSERT [Table1] 
    VALUES (1, 200, 1001, '9/07/2011'), 
      (1, -20, 1002, '9/08/2011'), 
      (1, 130, 1003, '10/10/2011'), 
      (2, 300, 1005, '10/10/2011') 

    CREATE TABLE [Table2] 
    (
     [ID] INT, 
     [cost] INT 
    ) 

    INSERT [Table2] 
    VALUES (1, 200), 
      (2, 300) 

    -- Query 
    ;WITH [cteTable1Sum] AS 
    (
     SELECT [ID], SUM([cost]) AS [cost] 
     FROM [Table1] 
     GROUP BY [ID] 
    )  
    SELECT [Table1].[ID], 
      [Table1].[TheDate], 
      [Table1].[traceNumber], 
      [Table1].[cost] AS [Frost_Balance], 
      cte.[cost] AS [SUM_Frost_Balance], 
      [Table2].[cost] AS [Ternean_Balance], 
      cte.[cost] - [Table2].[cost] AS [Ending_Balance] 
    FROM [Table1] 
    INNER JOIN [Table2] 
     ON [Table1].[ID] = [Table2].[ID] 
    INNER JOIN [cteTable1Sum] cte 
     ON [Table1].[ID] = cte.[ID] 

私はこれを試して、間違った答えを得ます。

WITH [cteTable1Sum] AS 
     (SELECT [ID], SUM([cost]) 
     AS [cost] FROM [Table1] 
     GROUP BY [ID], [TheDate]) 

答えて

4

あなたは、おそらくこのためMONTH()YEAR()機能を使用する必要があります。

;WITH [cteTable1Sum] AS 
    (
     SELECT [ID], 
       MONTH(TheDate) as Mo, 
       YEAR(TheDate) as yr, 
       SUM([cost]) AS [cost] 
     FROM [Table1] 
     GROUP BY [ID], MONTH(TheDate), YEAR(TheDate) 
    )  

これはあなたに、各IDについて、各月の毎月の内訳を提供します。次にJOINを次のように変更してください。

INNER JOIN [cteTable1Sum] cte 
     ON [Table1].[ID] = cte.[ID] 
     AND MONTH(Table1.TheDate) = cte.Mo 
     AND YEAR(Table1.TheDate) = cte.Yr 
+0

JNKさん、ありがとうございました。 – user973671

関連する問題