需要验证分组查询的解释是不是正确
Posted
技术标签:
【中文标题】需要验证分组查询的解释是不是正确【英文标题】:Need validation that interpretation for a Grouping Query is correct需要验证分组查询的解释是否正确 【发布时间】:2021-06-02 07:55:26 【问题描述】:我正在运行以下查询,起初它似乎给出了客户的小计,并且仅当所有付款的总和大于 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,但她的总和在汇总查询中报告为总付款的值。 这是正确的解释吗?
【问题讨论】:
查找并使用GROUPING() 并在您的have子句中添加一个条件,以便显示正确的条件。 【参考方案1】: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
总计的行。
【讨论】:
以上是关于需要验证分组查询的解释是不是正确的主要内容,如果未能解决你的问题,请参考以下文章