Mysql 用“选择”按钮选择位置?
我有一个查询,发现所有未清余额不等于0的人。我认为这一切都是好的,但扩大了可用的样本数据后,我发现它并不完全存在,我想不远 代码如下:Mysql 用“选择”按钮选择位置?,mysql,sql,database,select,Mysql,Sql,Database,Select,我有一个查询,发现所有未清余额不等于0的人。我认为这一切都是好的,但扩大了可用的样本数据后,我发现它并不完全存在,我想不远 代码如下: SELECT bookingRef, leadname, departureDate, balanceDueDate, totalDue, totalReceived, (totalDue - totalReceived) AS outstandingBalance, (SELECT SUM(CASE WHEN(totalDue
SELECT bookingRef, leadname, departureDate, balanceDueDate,
totalDue, totalReceived, (totalDue - totalReceived) AS outstandingBalance,
(SELECT SUM(CASE WHEN(totalDue - totalReceived) <> 0 THEN 1 ELSE 0 END)
FROM bookings) AS numberOutstanding,
(SELECT SUM(totalDue) FROM bookings) AS grossDue,
(SELECT SUM(totalReceived) FROM bookings) AS grossReceived,
(SELECT SUM(totalDue - totalReceived) FROM bookings) AS grossOutstanding
FROM bookings
WHERE (amendedDate BETWEEN '2015-09-30' AND '2016-09-30')
HAVING outstandingBalance <> 0;
发生的情况是,当日期在整个范围内时,结果是正确的。但是,当只执行上述一年时,它仍然对总范围进行求和,忽略求和的where子句
我想我需要将where子句添加到每个sum select中,但仍会遇到运行错误
我将如何实现这一点
非常感谢
注意:使用MySQL 8-10年而不使用它时非常生锈。没有MySQL窗口功能的解决方案
不幸的是,MySQL不支持窗口函数,这将使此查询更加方便。相反,您可以在案例中使用交叉联接。不过,由于MySQL也不支持公共表表达式,您将无法避免两次应用谓词:
SELECT b.bookingRef, b.leadname, b.departureDate, b.balanceDueDate,
b.totalDue, b.totalReceived, (b.totalDue - b.totalReceived) AS outstandingBalance, a.*
FROM bookings b,
CROSS JOIN (
SELECT
SUM(CASE WHEN(totalDue - totalReceived) <> 0 THEN 1 ELSE 0 END AS numberOutstanding,
SUM(totalDue) AS grossDue,
SUM(totalREceived) AS grossReceived,
SUM(totalDue - totalReceived) AS grossOutstanding
FROM bookings
WHERE (amendedDate BETWEEN '2015-09-30' AND '2016-09-30')
AND (totalDue - totalReceived) <> 0
) a
WHERE (b.amendedDate BETWEEN '2015-09-30' AND '2016-09-30')
AND (b.totalDue - b.totalReceived) <> 0;
关于拥有的旁注
我怀疑您使用HAVING子句是为了能够重新使用SELECT子句中的列名。这是非常特定于MySQL的,可能并不完全符合您的意图。HAVING在GROUP BY之后应用,因此在聚合之后应用。在您的查询中,您并不真正需要GROUP BY子句,因此我将避免使用HAVE非常感谢,阻止我拔头发。
SELECT bookingRef, leadname, departureDate, balanceDueDate,
totalDue, totalReceived, (totalDue - totalReceived) AS outstandingBalance,
SUM(CASE WHEN(totalDue - totalReceived) <> 0 THEN 1 ELSE 0 END) OVER() AS numberOutstanding,
SUM(totalDue) OVER() AS grossDue,
SUM(totalReceived) OVER() AS grossReceived,
SUM(totalDue - totalReceived) OVER() AS grossOutstanding
FROM bookings
WHERE (amendedDate BETWEEN '2015-09-30' AND '2016-09-30')
AND (b.totalDue - b.totalReceived) <> 0;