Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
涉及连接的SQL问题_Sql_Sql Server_Sql Server 2008_Tsql_Aggregate Functions - Fatal编程技术网

涉及连接的SQL问题

涉及连接的SQL问题,sql,sql-server,sql-server-2008,tsql,aggregate-functions,Sql,Sql Server,Sql Server 2008,Tsql,Aggregate Functions,我有两张布局相似的桌子,包括收入和支出。 id列是客户id 我需要一个客户总金额的结果,总结收入和费用 Table: Income | id | amountIN| +--------------+ | 1 | a | | 2 | b | | 3 | c | | 4 | d | Table: Expenses | id | amountOUT| +---------------+ | 1 | -x |

我有两张布局相似的桌子,包括收入和支出。
id
列是客户id

我需要一个客户总金额的结果,总结收入和费用

Table: Income
| id | amountIN|
+--------------+
| 1  |  a      |  
| 2  |  b      |  
| 3  |  c      |  
| 4  |  d      |  

Table: Expenses
| id | amountOUT|
+---------------+
| 1  |  -x      |   
| 4  |  -z      | 
我的问题是,一些客户只有费用,而另一些客户只有收入。。。所以不能预先知道我需要做一个
左或右连接。

在上面的例子中,一个右连接可以起作用,但是如果情况相反(费用表上的客户更多),它就不起作用

Expected Result
    | id | TotalAmount|
    +--------------+
    | 1  |  a - x  |  
    | 2  |  b      |  
    | 3  |  c      |  
    | 4  |  d - z  |

有什么帮助吗?

我相信完全连接可以解决您的问题。

我相信完全连接可以解决您的问题。

您真的应该有另一个表,如客户端:

select id, SUM(Amount)
from
(
    select id, amountin as Amount
    from Income
    union all
    select id, amountout as Amount
    from Expense
) a
group by id
Table: Client
| id | 
+----+
| 1  |  
| 2  |   
| 3  |  
| 4  |  
所以你可以这样做

SELECT Client.ID,  COALESCE(Income.AmountIN, 0) - COALESCE(Expenses.AmountOUT, 0)
FROM Client c
LEFT JOIN Income i ON i.ID = c.ID
LEFT JOIN Expense e ON e.ID = c.ID

这样就不那么复杂了,我相信下次它会派上用场:)

你真的应该有另一个类似客户机的表格:

Table: Client
| id | 
+----+
| 1  |  
| 2  |   
| 3  |  
| 4  |  
所以你可以这样做

SELECT Client.ID,  COALESCE(Income.AmountIN, 0) - COALESCE(Expenses.AmountOUT, 0)
FROM Client c
LEFT JOIN Income i ON i.ID = c.ID
LEFT JOIN Expense e ON e.ID = c.ID

这样就不那么复杂了,我相信下次它会派上用场的:)

我会把它当作一个联盟来对待。在子查询中执行此操作,然后对其求和

例如:

select id, sum(amt) from
(
  select i.id, i.amountIN as amt from Income i
  union all
  select e.id, e.amountOUT as amt from Expenses e
)
group by id

我会把这当作一个联盟。在子查询中执行此操作,然后对其求和

例如:

select id, sum(amt) from
(
  select i.id, i.amountIN as amt from Income i
  union all
  select e.id, e.amountOUT as amt from Expenses e
)
group by id

你试过什么?这是一个涉及聚合函数的简单语句。您尝试过什么?这是一个涉及聚合函数的简单语句。