【问题标题】:Return addition of common records with unique records from 3 tables从 3 个表中返回具有唯一记录的公共记录的添加
【发布时间】:2014-12-26 05:57:45
【问题描述】:

我有 3 个表 table1table2table3,它们之间没有任何关系。

mysql> select * from table1;

+-----------+--------+---------+
| scname    | sccode | samount |
+-----------+--------+---------+
| CustomerA | C1     |   20000 |
| CustomerB | C2     |   10000 |
+-----------+--------+---------+

sccode 是客户主表的外键。

mysql> select * from table2;

+--------------+---------+---------------+----------+--------+---------+
| raccname     | ramount | raccname2     | ramount2 | raccid | racc2id |
+--------------+---------+---------------+----------+---------+--------+
| CustomerA    |   10000 | Secured Loans |    10000 | C1     | 5       |
| CustomerB    |   12000 | SupplierB     |    12000 | C2     | S2      |
| Fixed Assets |    1000 | SupplierB     |     1200 | 4      | S2      |
+--------------+---------+---------------+----------+--------+---------+

raccidracc2id 分别是 raccnameraccname2 的代码,但它们与表没有关系

mysql> select * from table3;

+--------------+----------+---------------+-----------+--------+----------+
| pyaccname    | pyamount | pyaccname2    | pyamount2 |pyaccid | pyacc2id |
+--------------+----------+---------------+-----------+--------+----------+
| SupplierA    |    13000 | Secured Loans |     15000 | S1     | 5        |
| Fixed Assets |    12000 | SupplierB     |     12000 | 4      | S2       |
+--------------+----------+---------------+-----------+--------+----------+

pyaccidpyacc2id 分别是 pyaccnamepyaccname2 的代码,但它们与表没有关系。

我需要像这样的输出

+--------------+---------+
| account      |  amount | 
+--------------+---------+
| CustomerA    |   30000 | 
| CustomerB    |   22000 | 
| Fixed Assets |   13000 | 
| Secured Loans|   25000 | 
| SupplierA    |   13000 |
| SupplierB    |   25200 | 
+--------------+---------+

表示按原样添加公共记录和唯一记录。

【问题讨论】:

  • 什么是“客户主表”?您描绘的表格分别命名为table1table2table3,“它们之间没有任何关系”。您是如何在最终结果列表中汇总该数量的 - 根据给定的数据,它似乎只是虚构的?顺便说一句,可以通过将GROUP BY 与单值/组/标量函数 - sum() 结合使用来完成在公共行中添加列值的技巧。
  • 该帐户名称属于已创建的主帐户之一。虽然 raccname,raccname2,pyaccname & pyaccname 可以有来自任何一个 master 的记录,所以我无法添加外键。
  • 怎么来的:|供应商B | 25200 | ...到您需要的输出?
  • 供应商B 12000+12000+1200=25200

标签: mysql


【解决方案1】:

试试这个查询:

 SELECT name, sum(amount) FROM (
    (SELECT scname AS name, samount AS amount FROM table1)
    UNION ALL
    (SELECT raccname AS name, ramount AS amount FROM table2)
    UNION ALL
    (SELECT raccname2 AS name, ramount2 AS amount FROM table2)
    UNION ALL
    (SELECT pyaccname AS name, pyamount AS amount FROM table3)
    UNION ALL
    (SELECT pyaccname2 AS name, pyamount2 AS amount FROM table3)
) p GROUP BY name;

【讨论】:

  • 感谢您的回复,但它显示错误 1248 (42000):每个派生表都必须有自己的别名
  • 它对我有用。检查所有内容是否正确(我的列名可能有点不同等),并注意最后一个括号后面的小 p 。 note.io/1H1thyV
  • stackoverflow.com/questions/1888779/… - 检查这个。不要忘记为我发布的大选择设置任何名称。在我的例子中是 p。
【解决方案2】:

UNION 运算符仅返回出现在任一结果中的不同行,而 UNION ALL 运算符返回所有行。 UNION ALL 运算符不会消除重复的选定行。

所以这会做一些事情:

SELECT T1.`scname` "Account", sum(T1.`scamount`) "amount"
   FROM table1 T1
UNION
SELECT T2.`raccname` "Account", sum(T2.`ramount`) "amount"
   FROM table2 T2
UNION
SELECT T3.`pyaccname` "Account", sum(T3.`pyamount`) "amount"
   FROM table3 T3
GROUP BY `scamount`,`ramount`,`pyamount`;

【讨论】:

  • 它显示 group by 子句中列的未知列,我不想在数量列上显示。非常感谢您的回答
猜你喜欢
  • 1970-01-01
  • 2016-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多