【问题标题】:An aggregate function or the GROUP BY clause聚合函数或 GROUP BY 子句
【发布时间】:2025-12-20 04:00:07
【问题描述】:

我使用了以下查询:

SELECT DISTINCT 
    b.strCostCentreID, b.strPOSOnlineRefNo, b.strPayTypeCode,
    tblMachine.strDesc AS KioskName,
    (SUM(b.dblPaidAmt)) AS RM,
    (SUM(b.dblIpay88Amt)) AS pay88AmtRM,
    (SELECT STUFF((select   ','  + strProdType
     FROM tblCurrTrx AS a
     WHERE a.strPOSOnlineRefNo = b.strPOSOnlineRefNo FOR XML PATH('')), 1, 1,'')) AS Agency
FROM 
    tblCurrTrx AS b
INNER JOIN 
    tblMachine ON b.strMachID = tblMachine.strMachID
WHERE 
    b.strPaymentMethod = '2' 
    AND (dtmTrans >= '1/3/2020') 
    AND (strTransStatus = '01')
GROUP BY 
    b.strPOSOnlineRefNo

但我收到以下错误:

消息 8120,第 16 级,状态 1,第 1 行
列 'tblCurrTrx.strCostCentreID' 在选择列表中无效,因为它既不包含在聚合函数中,也不包含在 GROUP BY 子句中。

【问题讨论】:

  • GROUP BY b.strCostCentreID , b.strPOSOnlineRefNo, b.strPayTypeCode, tblMachine.strDesc.
  • 非常感谢 Akina 第一次工作。现在来了解这一点!

标签: sql asp.net sql-server


【解决方案1】:

请按字段添加分组

    select distinct b.strCostCentreID ,  b.strPOSOnlineRefNo, b.strPayTypeCode, tblMachine.strDesc as KioskName, 
         (SUM(b.dblPaidAmt)) as RM ,(SUM(b.dblIpay88Amt)) As pay88AmtRM ,

        (Select STUFF((select   ','  +strProdType from tblCurrTrx as a  where a.strPOSOnlineRefNo = b.strPOSOnlineRefNo for xml path('')),1,1,'')) as Agency


        From tblCurrTrx as b INNER JOIN tblMachine ON b.strMachID = tblMachine.strMachID WHERE  

        b.strPaymentMethod = '2' and (dtmTrans>='1/3/2020') AND (strTransStatus='01') 

group by b.strCostCentreID,b.strPOSOnlineRefNo, b.strPayTypeCode, tblMachine.strDesc

【讨论】:

    【解决方案2】:

    试试这个:

    SELECT DISTINCT b.strCostCentreID
                   ,b.strPOSOnlineRefNo
                   ,b.strPayTypeCode
                   ,tblMachine.strDesc AS KioskName
                   ,SUM(b.dblPaidAmt) AS RM
                   ,SUM(b.dblIpay88Amt) AS pay88AmtRM
                  ,DS.Agency
    FROM tblCurrTrx AS b
    INNER JOIN tblMachine 
        ON b.strMachID = tblMachine.strMachID
    OUTER APPLY
    (
        SELECT STUFF
        (
            (
                select   ','  + strProdType
                FROM tblCurrTrx AS a
                WHERE a.strPOSOnlineRefNo = b.strPOSOnlineRefNo 
                FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)')
            ,1
            ,1
            ,''
        )
    ) DS(Agency)
    WHERE b.strPaymentMethod = '2' 
        AND dtmTrans >= '1/3/2020' 
        AND strTransStatus = '01'
    GROUP BY b.strCostCentreID
            ,b.strPOSOnlineRefNo
            ,b.strPayTypeCode
            ,tblMachine.strDesc
            ,DS.Agency
    

    【讨论】:

      【解决方案3】:

      如果您使用 group by 子句而不是 select 语句列应包含在 group by 中,即

      select distinct b.strCostCentreID ,  b.strPOSOnlineRefNo, b.strPayTypeCode, tblMachine.strDesc as KioskName, 
       (SUM(b.dblPaidAmt)) as RM ,(SUM(b.dblIpay88Amt)) As pay88AmtRM ,
      
      (Select STUFF((select   ','  +strProdType from tblCurrTrx as a  where a.strPOSOnlineRefNo = b.strPOSOnlineRefNo for xml path('')),1,1,'')) as Agency
      
      
      From tblCurrTrx as b INNER JOIN tblMachine ON b.strMachID = tblMachine.strMachID WHERE  
      
      b.strPaymentMethod = '2' and (dtmTrans>='1/3/2020') AND (strTransStatus='01') group by b.strPOSOnlineRefNo, b.strCostCentreID , b.strPayTypeCode, tblMachine.strDesc 
      

      【讨论】:

      • 在 GROUP BY 中两次提及 b.strPOSOnlineRefNo 是多余的。