select customer_id,min(order_date)a,sum(case when (order_date=customer_pref_delivery_date and order_date=min(order_date)) then 1 else 0 end)
from delivery
group by customer_id
sum函数这儿是错误的,为什么
select customer_id,min(order_date)a,sum(case when (order_date=customer_pref_delivery_date and order_date=min(order_date)) then 1 else 0 end)
from delivery
group by customer_id
SELECT
customer_id,
MIN(order_date) AS a,
SUM(CASE WHEN order_date = customer_pref_delivery_date AND order_date = MIN(order_date) THEN 1 ELSE 0 END) AS count_condition
FROM delivery
GROUP BY customer_id;
【以下回答由 GPT 生成】
在SQL中,聚合函数用于对某一列或多列进行计算并返回一个结果。常见的聚合函数有SUM、COUNT、MIN、MAX等。
在给定的SQL查询中,SUM函数的使用是错误的,原因是不能在一个聚合函数中嵌套另一个聚合函数。具体来说,在SUM函数的参数中使用了另一个聚合函数MIN。
聚合函数的工作原理是将一组行作为输入,计算出一个单一的值作为输出。而嵌套聚合函数会引发问题,因为内部聚合函数的结果取决于外部聚合函数的计算结果,而外部聚合函数又依赖于内部聚合函数的结果,形成了一个循环依赖的关系。
这种循环依赖会导致计算结果无法准确确定,因为无法确定先执行哪个聚合函数。这是SQL语法的限制,防止在聚合函数中出现歧义的情况。
为了解决这个问题,可以使用子查询或临时表的方式进行嵌套计算。可以先计算内部的聚合函数,然后将结果作为参数传递给外部的聚合函数。下面是一个可能的解决方案示例:
SELECT customer_id, a, SUM(b) FROM (
SELECT customer_id, MIN(order_date) AS a, CASE WHEN (order_date=customer_pref_delivery_date AND order_date=MIN(order_date)) THEN 1 ELSE 0 END AS b
FROM delivery
GROUP BY customer_id
) AS subquery
GROUP BY customer_id, a
在上面的解决方案中,首先通过子查询计算出内部的聚合函数MIN和CASE。然后将结果作为表(subquery)进行进一步的计算,使用外部的聚合函数SUM进行汇总。
总结来说,在SQL查询中,不能在聚合函数中嵌套另一个聚合函数,因为会导致循环依赖和计算结果的不确定性。可以通过子查询或临时表的方式解决这个问题。以上是一个可能的解决方案,具体的解决方法还需要根据实际情况进行调整。
【相关推荐】