我想按年打印每个州的订单总数。但这是打印多个状态,而不是单独的。
SELECT DISTINCT
customer_state,
COUNT(*),
YEAR(order_purchase_timestamp) AS year
FROM
olist_orders_dataset
JOIN
olist_customers_dataset ON olist_orders_dataset.customer_id = olist_customers_dataset.customer_id
GROUP BY
YEAR(order_purchase_timestamp), customer_state
我得到这样的输出:
首先,我认为没有必要指出你的"输出";不符合你的要求。不同的列顺序和名称。然后CA的2行(123和1234)变成了1行(1995)?数学没那么难。对这种性质的简单疏忽表明缺乏努力。
您的输出表明您看到的两个值为"AC"实际上并不相同。这通常意味着有一个不能显示的尾随字符(例如,制表符或换行符)。如果是这种情况,那么您必须首先"修复"。您的数据,然后修复正在填充表的进程。
要验证这是问题所在,您可以将列转换为varbinary
,以查看存储在其中的十六进制值。例子:
select customer_state, cast(customer_state as varbinary(20)) as bin_state, count(*)
from @tbl
where customer_state like 'AC%'
group by customer_state order by customer_state
;
小提琴来演示。如果我的猜测是正确的,那么我们可以从中学到重要的一课。在不了解原因的情况下,停止向查询中抛出代码来修复问题。
最后一点。聚合倾向于以某种顺序生成行。这是执行计划的产物。如果结果集中的行顺序很重要(通常如此),查询必须有一个ORDER BY
子句。这适用于所有查询,而不仅仅是那些使用聚合的查询。