首页 > 解决方案 > 子查询返回超过 1 个值 - 多个错误消息

问题描述

我在下面有这段代码,我收到了这个错误:子查询返回了超过 1 个值。如您所见,我正在使用导致此问题的子查询。

该怎么办?请帮我解决这个问题。

    SELECT 
    [MAGASIN] = ET2.ET_LIBELLE ,
    [CA]= sum(GL_MONTANTTTC),
    [NBR TICKET] = count(distinct GL_NUMERO),

    (SELECT
    [NBR TICKET] = count(distinct GL_NUMERO)

    FROM GCLIGNEARTDIM 

LEFT OUTER JOIN ETABLISS ET2 ON GL_ETABLISSEMENT=ET2.ET_ETABLISSEMENT 
    LEFT OUTER JOIN COMMERCIAL GCL3 ON GL_REPRESENTANT=GCL3.GCL_COMMERCIAL 
    WHERE (GL_DATEPIECE >= '20190228 00:00:00' AND GL_DATEPIECE < '20190301 00:00:00' 
    AND (GCL3.GCL_LIBELLE='vendeur x'))
    AND GL_ETABLISSEMENT in ('W01','W05','F10')

    GROUP BY
    ET2.ET_LIBELLE

    )AS 'VENDEUR X'

    FROM GCLIGNEARTDIM 

LEFT OUTER JOIN ETABLISS ET2 ON GL_ETABLISSEMENT=ET2.ET_ETABLISSEMENT  
    LEFT OUTER JOIN COMMERCIAL GCL3 ON GL_REPRESENTANT=GCL3.GCL_COMMERCIAL 


    WHERE (GL_DATEPIECE >= '20190228 00:00:00' AND GL_DATEPIECE < '20190301 00:00:00'
    AND GL_ETABLISSEMENT in ('W01','W05','F10')

    GROUP BY
    ET2.ET_LIBELLE

    ORDER BY
    ET2.ET_LIBELLE

标签: sql

解决方案


您的代码可以使用一些重新格式化来帮助提高可读性。如果人们可以快速轻松地消化您的问题和代码,您更有可能获得高质量的答案。此外,您在外部查询的 WHERE 子句中有一个额外的左括号。

使用子查询时,应避免使用与外部查询相同的表别名。使用唯一别名。

您遇到的问题是由您生成列 VENDEUR X 的子查询引起的。要使子查询正常工作,它只需要在执行时返回一行。在您的情况下,它返回多行抛出错误消息。

要解决问题,请独立运行子查询并检查返回的数据。您正在对具有多个值的列 ET2.ET_LIBELLE 进行分组。根据我猜你正在尝试做的事情,你应该将 ET2.ET_LIBELLE 添加到 WHERE 子句中。请参阅下面的示例。

SELECT 
    [MAGASIN] = ET2.ET_LIBELLE,
    [CA]= SUM(GL_MONTANTTTC),
    [NBR TICKET] = COUNT(DISTINCT GL_NUMERO),
    (
        SELECT [NBR TICKET] = COUNT(DISTINCT GL_NUMERO) 
        FROM 
            GCLIGNEARTDIM 
            LEFT OUTER JOIN ETABLISS ETI ON GL_ETABLISSEMENT=ETI.ET_ETABLISSEMENT 
            LEFT OUTER JOIN COMMERCIAL GCLI ON GL_REPRESENTANT=GCLI.GCL_COMMERCIAL 
        WHERE 
            (
                GL_DATEPIECE >= '20190228 00:00:00' 
                AND GL_DATEPIECE < '20190301 00:00:00' 
                AND (GCL3.GCL_LIBELLE='vendeur x')
            )
            AND GL_ETABLISSEMENT IN ('W01','W05','F10')
            AND ETI.ET_LIBELLE = ET2.ET_LIBELLE
    ) AS 'VENDEUR X'
FROM 
    GCLIGNEARTDIM 
    LEFT OUTER JOIN ETABLISS ET2 ON GL_ETABLISSEMENT=ET2.ET_ETABLISSEMENT  
    LEFT OUTER JOIN COMMERCIAL GCL3 ON GL_REPRESENTANT=GCL3.GCL_COMMERCIAL
WHERE 
    GL_DATEPIECE >= '20190228 00:00:00' 
    AND GL_DATEPIECE < '20190301 00:00:00' 
    AND GL_ETABLISSEMENT IN ('W01','W05','F10')
GROUP BY
    ET2.ET_LIBELLE
ORDER BY
    ET2.ET_LIBELLE

推荐阅读