【问题标题】:fetch count(number of invoices generated) from 2nd table and sum(total amount of orders) from 3rd table - MySQL从第二个表中获取计数(生成的发票数量)和从第三个表中获取总和(订单总数) - MySQL
【发布时间】:2019-07-19 19:53:55
【问题描述】:
CREATE TABLE IF NOT EXISTS `cust` (
  `cId` int(11) NOT NULL,
  `name` char(25) DEFAULT NULL,
  PRIMARY KEY (`cId`)
);

INSERT INTO `cust` (`cId`, `name`) VALUES
(1, 'Danish'),
(2, 'Dilkash'),
(3, 'Dilshad');

CREATE TABLE IF NOT EXISTS `inv` (
  `iId` int(11) NOT NULL,
  `cId` int(11) DEFAULT NULL,
  PRIMARY KEY (`iId`)
);

INSERT INTO `inv` (`iId`, `cId`) VALUES
(1, 1),
(2, 1),
(3, 1),
(4, 2),
(5, 2);

CREATE TABLE IF NOT EXISTS `ord` (
  `iId` int(11) DEFAULT NULL,
  `cId` decimal(10,0) DEFAULT NULL
);

INSERT INTO `ord` (`iId`, `cId`) VALUES
(1, '50'),
(1, '80'),
(2, '40'),
(3, '20'),
(3, '30'),
(4, '90'),
(5, '60'),
(5, '40');

我想获取客户生成的发票数量和所有订单的总和。有 3 个表 cust,inv,ord 分别代表customers,invoicec,orders

:::::::::::::::工作正常:::::::::::::: 我尝试使用此查询获取使用客户姓名生成的发票总数...它工作正常...

mysql> select cust.cId,cust.name,count(inv.iId)
from cust left join inv on cust.cId=inv.cId group by cust.cId;
+-----+---------+----------------+
| cId | name    | count(inv.iId) |
+-----+---------+----------------+
|   1 | Danish  |              3 |
|   2 | Dilkash |              2 |
|   3 | Dilshad |              0 |
+-----+---------+----------------+

:::::::::::::::工作正常:::::::::::::: 然后我尝试获取按客户分组生成的所有发票的总和......它也可以正常工作

mysql> select cust.cId,cust.name,count(inv.iId)
from cust left join inv on cust.cId=inv.cId group by cust.cId;
+-----+---------+----------------+
| cId | name    | count(inv.iId) |
+-----+---------+----------------+
|   1 | Danish  |              3 |
|   2 | Dilkash |              2 |
|   3 | Dilshad |              0 |
+-----+---------+----------------+
3 rows in set (0.00 sec)

:::::::::::::问题在这里::::::::::::::::::

但是当我尝试在相同的结果中获取 COUNT 和 SUM 时,它不起作用......它计算的是订单而不是发票......

mysql> select cust.cId,cust.name,count(inv.iId),sum(ord.cId)
from cust left join inv on cust.cId=inv.cId left join ord on inv.iId=ord.iId group by cust.cId;
+-----+---------+----------------+--------------+
| cId | name    | count(inv.iId) | sum(ord.cId) |
+-----+---------+----------------+--------------+
|   1 | Danish  |              5 |          220 |
|   2 | Dilkash |              3 |          190 |
|   3 | Dilshad |              0 |         NULL |
+-----+---------+----------------+--------------+
3 rows in set (0.00 sec)

请更正我的最后一个查询...它显示 5,3,0 是订单数量而不是发票数量...它应该显示 3,2,0...。

【问题讨论】:

标签: java mysql sql


【解决方案1】:

您可以使用标量子查询

DEMO

 select cust.cId,cust.name,(select count(iId) from inv b where cust.cId=b.cId ),
sum(ord.cId)
from cust left join inv on cust.cId=inv.cId left join ord on inv.iId=ord.iId 
group by cust.cId

输出:

cId name      invcnt    sum(ord.cId)
1   Danish     3         220
2   Dilkash    2         190
3   Dilshad    0    

【讨论】:

    【解决方案2】:

    由于LEFT JOIN,您得到了重复,与DISTINCT 相同的查询应该可以工作,例如:

    SELECT cust.cId, cust.name, COUNT(DISTINCT inv.iId), SUM(ord.cId)
    FROM cust LEFT JOIN inv ON cust.cId=inv.cId 
    LEFT JOIN ord ON inv.iId=ord.iId 
    GROUP BY cust.cId, cust.name;
    

    这里是 SQL Fiddle

    【讨论】:

    • 谢谢您,先生.. 它有效...(另一个问题)也许您是对的先生,但起初我没有左连接但问题相同,请查看此查询并选择 cust。 cId,cust.name,count(inv.iId),sum(ord.cId) from cust,inv,ord where cust.cId=inv.cId and inv.iId=ord.iId group by cust.cId;
    • 没有left join你不能这样做,因为它不会显示其他表中不存在的记录。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-08
    • 2013-08-23
    • 2013-12-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多