2016-04-29 85 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))。 –