SQL Server: DISTINCT with joins



我想按年打印每个州的订单总数。但这是打印多个状态,而不是单独的。

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

我得到这样的输出:

Num_orders1231234234

首先,我认为没有必要指出你的"输出";不符合你的要求。不同的列顺序和名称。然后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子句。这适用于所有查询,而不仅仅是那些使用聚合的查询。

相关内容

  • 没有找到相关文章

最新更新