2016-04-29 48 views
-2

加入我練習30:SQL雙人結果與分組

下,貨幣(INC)和支出(出)款項可註冊的假設任意次數,每天爲每個採集點[即代碼列是主鍵],爲每個收集點的每個運行日期顯示一個對應行的表格。 結果集:點數,日期,每天總支出(out),每天總收入(inc)。 缺少值被認爲是NULL。

schema of database(其回收公司) 這裏是我的代碼:

WITH IO_table 
AS 
(SELECT point, "date" FROM Income 
UNION 
SELECT point, "date" FROM Outcome) 

SELECT io.point, io.date, SUM(o.out), SUM(i.inc) 
FROM IO_table io 
LEFT OUTER JOIN Income i ON io.point = i.point AND io."date" = i."date" 
LEFT OUTER JOIN Outcome o ON io.point = o.point AND io."date" = o."date" 
GROUP BY 
io.point, io.date 

Here是已經翻番和結果的結果。我在任何地方查過,但我並不真正瞭解它。

+0

您可以添加收入和外分數據嗎?我猜Income主鍵也在結果表中,所以當你加入IO_Table時,你會找到同一個鍵的2條記錄。可能嗎? –

回答

0

這就是爲什麼你的資金是多方面的:比方說,在同一日期和點有與INC 150和250以及三個結果兩個稅記錄沒有100,200和300的記錄。你加入這些記錄,所以你得到150-100,150-200,150-300,250-100,250-200,250-300對。現在,您彙總並計算出:這意味着inc = 3 x(150 + 250)= 1200 out = 2 x(100 + 200 + 300)= 1200,而不是所需inc = 400和out = 600.


當想從不同的表中聚集,不加入的表,但聚集,如:

LEFT OUTER JOIN 
(
    select point, "date", sum(inc) as total 
    from Income 
    group by point, "date" 
) i ON io.point = i.point AND io."date" = i."date" 

你的情況,你想有一個完整的外部聯接兩個聚集的:

select 
    point, 
    "date", 
    coalesce(i.total, 0) as inc_total, 
    coalesce(o.total, 0) as out_total 
from 
(
    select point, "date", sum(inc) as total 
    from income 
    group by point, "date" 
) i 
full outer join 
(
    select point, "date", sum(out) as total 
    from outcome 
    group by point, "date" 
) o using(point, "date"); 

這是PostgreSQL中的標準SQL。對於SQL Server,您需要[date]而不是標準"date"ON clause而不是簡單的USING子句。

0

目前無法區分IO_table中的收入和結果。因此,您將每個值加兩次,一次用於收入,一次用於結果。解決此問題的一種方法是在IO_table中添加另一列以區分這兩個列,然後更新您的連接語句以包含新列。

-1

我想這是你要搜索的內容:

SELECT X.POINT,X.DATE,SUM(OUT),SUM(INC) FROM (
    SELECT I.POINT,I.DATE,0 AS OUT, SUM(I.INC) AS INC FROM INCOME I 
    GROUP BY I.POINT,I.DATE 
    UNION 
    SELECT O.POINT,O.DATE,SUM(O.OUT) AS OUT , 0 AS INC FROM OUTCOME O 
    GROUP BY O.POINT,O.DATE) AS X 
GROUP BY POINT,DATE 
+0

是的,這就是它......當我將這個練習的零值更改爲空值時它可以工作 –

+0

如果你喜歡我的答案,請確定它。例如,如果您需要使用空值來操作,則可以使用SUM(Isnull(inc,0))。 –