sql - 如何使用具有不同 where 条件的多项选择获得结果
问题描述
我有四个表客户、订单、订单项和销售,我想获得每个客户的应付总额以及每个客户的余额。为此,我尝试了这个 SQL 查询:
SELECT c.name AS CustomerName,
c.contactnumber AS CustomerContactNumber,
c.location AS CustomerAddress,
SUM(oi.amount) AS Amount,
SUM(t2.balance) AS Balance
FROM orderitems oi
INNER JOIN orders o ON oi.orderid = o.id
INNER JOIN customers c ON o.customerid = c.id
INNER JOIN
(SELECT s.customerid,
SUM(s.balance) AS Balance
FROM sales s
INNER JOIN customers c ON s.customerid = c.id
GROUP BY s.customerid) t2 ON t2.customerid = c.id
WHERE o.status == 'Processing'
GROUP BY
c.id, c.contactnumber, c.location
它生成以下输出:
它正确计算了应付金额,但它计算了两次余额,因为两个客户的原始余额均为 100,但每个客户显示为 200。
另请注意,订单有一个状态栏,如果订单金额到期,则显示“处理中”,如果有一些余额,则显示“未完成”。
表结构是:
订单:
销售量:
订单项:
顾客:
请帮忙。
解决方案
您正在对外部查询中的余额求和,但您不应该这样做,因为它是在子查询中求和的。您可以按余额分组(这不是很好的设计理论,但它很实用);或者你可以对 sum(amount) 做一个单独的子查询,然后加入余额而不分组。
SELECT c.name AS CustomerName,
c.contactnumber AS CustomerContactNumber,
c.location AS CustomerAddress,
SUM(oi.amount) AS Amount,
t2.balance AS Balance
FROM orderitems oi
INNER JOIN orders o ON oi.orderid = o.id
INNER JOIN customers c ON o.customerid = c.id
INNER JOIN (
SELECT customerid, SUM(balance) AS Balance
FROM sales
GROUP BY customerid
) t2 ON t2.customerid = c.id
WHERE o.status == 'Processing'
GROUP BY c.id, c.contactnumber, c.location, c.name, t2.balance
作为2个子查询:
SELECT c.name AS CustomerName,
c.contactnumber AS CustomerContactNumber,
c.location AS CustomerAddress,
t3.Amount AS Amount,
t2.balance AS Balance
FROM customers c
INNER JOIN ( -- subquery to return Amount for each customerid
select o.customerid, sum(oi.amount) AS Amount
FROM orderitems oi
INNER JOIN orders o ON oi.orderid = o.id
GROUP BY o.customerid
WHERE o.status == 'Processing'
) t3 on t3.cusomterid = c.id
INNER JOIN ( -- subquery to return balance for each customerid
SELECT customerid, SUM(balance) AS Balance
FROM sales
GROUP BY customerid
) t2 ON t2.customerid = c.id
推荐阅读
- python - 将字符串 numpy.ndarray 转换为浮点数 numpy.ndarray
- django - 更改数据库后重新启动 Django 服务器
- c# - 如何实现 Android ISO 并将其加载到 C# WinForm 应用程序中?
- marklogic - 路径范围索引方面搜索在 Marklogic 9 中不起作用
- java - Mockito 让 mock 从现有的 mock 继承存根
- reactjs - 如果父组件卸载,防止子道具更新
- highcharts - 停止 HighCharts 在悬停一个系列时更改另一个系列的透明度
- python - 尝试从 github Enterprise 克隆时连接被拒绝
- symfony - 按字段对学说的@OneToMany ArrayCollection 进行排序
- javascript - 如何将 rabbitMQ 连接分配给类的属性以在另一个函数中使用它?