1

我正在运行以下查询,起初它似乎为客户提供了小计,并且仅当所有付款的总额大于 90,000 美元时,才按日期显示每个客户的付款金额。

SELECT 
    Customername, 
    Date(paymentDate), 
    CONCAT('$', Round(SUM(amount),2)) AS 'High $ Paying Customers'
FROM Payments 
JOIN Customers  
     On payments.customernumber = customers.customernumber
Group by customername, Date(paymentDate) WITH ROLLUP
having sum(amount)> 90000;

查询结果

但在查看 Dragon Souveniers, Ltd. 和 Euro+ Shopping Channel 的记录时,实际上显示的付款日期分别超过 90000 美元,以及该客户的小计汇总。对于所有其他客户,他们的个人付款日期不会在结果集中报告,只有他们的总和超过 90000 美元。例如,Annna 的装饰品为 4 条付款记录,但没有一条超过 90000,但她的总和在汇总查询中报告为总付款的值。 这是正确的解释吗?

安娜的付款

4

1 回答 1

0

HAVING 子句正常工作,它过滤总数不超过 90000 的所有记录。它也对总数执行此操作。

使用时GROUP BY .... WITH ROLLUP,可以使用GROUPING()函数检测创建的​​ ROLL UP 行。

您应该以不过滤所需列的方式添加条件。

简单的例子:

select a, sum(a), grouping(a<3) 
from (select 1 as a 
      union 
      select 2 
      union select 3) x 
group by a<3 with rollup;

输出:

+---+--------+---------------+
| a | sum(a) | grouping(a<3) |
+---+--------+---------------+
| 3 |      3 |             0 |
| 1 |      3 |             0 |
| 1 |      6 |             1 |
+---+--------+---------------+

这表明最后一行(带有grouping(i<3) == 1)是包含 总计的行a<3

于 2021-03-03T17:47:34.190 回答