Teradata SQL:如何生成唯一客户列并实现数据聚合查询?
Teradata实现按PART_NO分组聚合并生成唯一客户列表
针对你的需求,原查询报错有两个核心原因:一是Teradata的LISTAGG对CHAR类型列支持有限,需要显式转换为VARCHAR;二是未对客户去重,会导致列表出现重复客户(若表中有重复记录)。以下是可行的解决方案:
方案一:先去重客户再关联聚合
适用于所有Teradata版本,先提取每个PART_NO对应的唯一客户,再和汇总数据关联:
WITH unique_customer AS ( SELECT DISTINCT PART_NO, CUSTOMER FROM table_name ), part_summary AS ( SELECT PART_NO, SUM(QTY) AS QTY, COUNT(DISTINCT CUSTOMER) AS CUST_CNT FROM table_name GROUP BY PART_NO ) SELECT ps.PART_NO, ps.QTY, ps.CUST_CNT, LISTAGG(uc.CUSTOMER, ',') WITHIN GROUP (ORDER BY uc.CUSTOMER) AS CUST_LIST FROM part_summary ps JOIN unique_customer uc ON ps.PART_NO = uc.PART_NO GROUP BY ps.PART_NO, ps.QTY, ps.CUST_CNT;
方案二:使用DISTINCT LISTAGG(Teradata 16.20+)
如果你的Teradata版本在16.20及以上,支持LISTAGG(DISTINCT)语法,可以直接简化查询:
SELECT PART_NO, SUM(QTY) AS QTY, COUNT(DISTINCT CUSTOMER) AS CUST_CNT, LISTAGG(DISTINCT CAST(CUSTOMER AS VARCHAR(100)), ',') WITHIN GROUP (ORDER BY CUSTOMER) AS CUST_LIST FROM table_name GROUP BY PART_NO;
错误细节说明
[3706]语法错误:因为CUSTOMER列大概率是CHAR类型,Teradata的LISTAGG对该类型兼容性差,转换为VARCHAR即可解决。- 原查询未处理重复客户:若表中同一
PART_NO下存在重复的CUSTOMER记录,会导致CUST_LIST出现重复值,通过DISTINCT去重后才能符合需求。
内容的提问来源于stack exchange,提问作者user21077255
相关产品推荐
相关产品推荐

