2011-10-10 35 views
5

Tôi cần so sánh số dư cuối cùng của hai bảng từ các máy khách khác nhau được nhóm theo ID. Các bảng có cùng ID nhưng một bảng có nhiều mục nhập ID và cái kia thì không. Tôi cần phải tổng hợp hàng từ bảng với nhiều mục vì vậy tôi chỉ có một số cuối cùng để thực hiện các phép tính.Cách nhóm theo hai trường dữ liệu trong biểu thức bảng chung

Tôi có truy vấn thực hiện điều này nhiều, nhưng bây giờ tôi cũng cần thực hiện theo từng nhóm một tháng. Truy vấn hiện tại của tôi tổng cộng nó cho tất cả các ngày. Dữ liệu thực sự cần được sắp xếp theo ID và theo tháng để chúng biết số dư hàng tháng kết thúc cho mỗi ID. Có cách nào để làm điều này với những gì tôi có cho đến nay?

Xin cảm ơn trước.

Đây là những gì tôi có cho đến nay.

-- 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] 

Tôi đã thử cách này và tôi nhận được câu trả lời sai.

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

Trả lời

4

Bạn có lẽ nên sử dụng các chức năng MONTH()YEAR() cho việc này:

;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) 
    )  

này sẽ cung cấp cho bạn sự phân hủy hàng tháng của mỗi tháng cho mỗi ID. Sau đó, thay đổi JOIN của bạn thành:

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

Cảm ơn bạn JNK, đã hoạt động. – user973671

Các vấn đề liên quan