2011-09-30 59 views
0

我需要比較來自按ID分組的不同客戶端的兩個表的最終餘額。這些表具有相同的ID但是其中一個具有多個ID條目,另一個不具有。我需要從表格中總結出多條記錄,所以我只有一個最終數字來進行計算。什麼是在視圖的結果集中返回非聚集列的聚集列的最佳方式

表1:

ID, cost, traceNumber, TheDate 
1,  200,  1001,   10/07/2011 
1,  -20,  1002,   10/08/2011 
1,  130,  1003,   10/10/2011 
2,  300,  1005,   10/10/2011 

表2:

ID, cost 
1,  200 
2,  300 

結果爲ID 1,將310相比,200表2用110

查詢的差看起來像這個。

SELECT DISTINCT 
    Table1.ID, 
    Table1.TheDate , 
    Table1.traceNumber, 
    Table1.[cost] AS Frost_Balance, 
    SUM(Table1.[cost]) AS SUM_Frost_Balance, 
    Table2.[cost] AS Ternean_Balance, 
    SUM(Table1.[cost]) - Table2.[cost] AS Ending_Balance, 
FROM 
    Table1 
    INNER JOIN Table2 ON Table1.ID =Table2.CustomerID 
GROUP BY 
    dbo.Frost.ID 

查詢必須在結果集中顯示多個列,因爲它將用於報告。我嘗試在結果集中的所有列進行分組,但這給了我錯誤的結果。還有另一種計算需要總結的列的方法嗎?

+0

是您的問題實際上兩者的SQL Server 2008 *和* MySQL的?後者似乎不相關。 –

回答

0

這是你想要做什麼?

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

INSERT [Table1] 
VALUES (1, 200, 1001, '10/07/2011'), 
     (1, -20, 1002, '10/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] 
+0

你真棒,這正是我正在尋找,並感謝您的快速答覆。 但你能解釋一下這段代碼 ; WITH [cteTable1Sum作爲 ( SELECT [ID],SUM([費用])AS [費用] FROM [表1] GROUP BY [ID] ) 什麼是; WITH以及如何在select語句中引用cte? 謝謝 – user973671

+0

[SQL Server 2008 - 使用通用表表達式](http://msdn.microsoft.com/en-us/library/ms190766(v = SQL.100).aspx) –

+0

我只能使用'cte'因爲我在第二個INNER JOIN中創建了這個表作爲別名。這裏閱讀更多 - [使用表別名](http://msdn.microsoft.com/en-us/library/ms187455(v = SQL.100).aspx)。 –

1

您可以使用 「窗口集合函數」 是這樣的:

select 
    table1.*, 
    sum(table1.cost) over (partition by table1.id) sum_frost_balance, 
    table2.cost, 
    sum(table1.cost) over (partition by table1.id) - table2.cost ending_balance 
from table1 
    join table2 on table1.id = table2.id