需要验证分组查询的解释是不是正确

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&lt;3) == 1)是包含a&lt;3 总计的行。

【讨论】:

以上是关于需要验证分组查询的解释是不是正确的主要内容,如果未能解决你的问题,请参考以下文章

LINQ 分组查询

Oracle查询语句怎么样按天分组

如何正确分组我的 LINQ 查询?

SQL 分组不起作用

SQL查询语句.GroupBy分组

GraphQL 中的分组查询(不是“分组依据”)