如何在Join查询中使用MAX()

时间:2013-10-14 06:28:51

标签: sql sql-server

我想创建一个从RECIPT表中获取RECID的查询,它是来自Customer表的custname,以及RECIPT上的RECID的最大值。但不知何故,此查询会引发错误。它在我添加max(MAX(REC.REC_Id_I)为RECID)时开始。

查询是:

SELECT
    REC.REC_Id_I,
    REC.REC_No_V,
    CUS.CUS_Name_V,
    REC.REC_PaidAmount_M,
    CASE
        WHEN REC.REC_PayMode_C = 'C' THEN 'Cash'
        ELSE 'Cheque'
    END AS REC_PayMode_C,
    REC.REC_BankName_V,
    REC.REC_BankAddress,
    REC.REC_ChequeNo_V,
    convert(varchar, REC.REC_ChequeDate_D, 103) AS REC_ChequeDate_D,
    REC.REC_Date_D,
    MAX(REC.REC_Id_I) As RECID
FROM TBL_Receipts REC
JOIN TBL_CustomerMaster CUS ON REC.REC_CustomerId_I = CUS.CUS_Id_I
WHERE
  REC_Active_c='y'
  AND REC_SalesMasterId_I='0'
ORDER BY REC_Id_I

错误IS:

  

消息8120,级别16,状态1,过程sp_Receipt_Select,第15行列'TBL_Receipts.REC_Id_I'在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中。

5 个答案:

答案 0 :(得分:2)

如果您仍然遇到GROUP BY子句的问题,可以尝试这样的事情,它应该可以工作,即使它不是最佳解决方案

SELECT
    REC.REC_Id_I,
    REC.REC_No_V,
    CUS.CUS_Name_V,
    REC.REC_PaidAmount_M,
    CASE
        WHEN REC.REC_PayMode_C = 'C' THEN 'Cash'
        ELSE 'Cheque'
    END AS REC_PayMode_C,
    REC.REC_BankName_V,
    REC.REC_BankAddress,
    REC.REC_ChequeNo_V,
    convert(varchar, REC.REC_ChequeDate_D, 103) AS REC_ChequeDate_D,
    REC.REC_Date_D,
    recid.maxRECID As RECID
FROM TBL_Receipts REC
JOIN TBL_CustomerMaster CUS ON REC.REC_CustomerId_I = CUS.CUS_Id_I
JOIN (SELECT MAX(REC_ID_I) as maxRECID, REC_CustomerId_I FROM REC group by REC_CustomerId_I) as recid ON recid.REC_CustomerId_I = REC.REC_CustomerId_I
WHERE
  REC_Active_c='y'
  AND REC_SalesMasterId_I='0'
ORDER BY REC_Id_I

答案 1 :(得分:1)

除了聚合函数之外,您几乎需要按所有选定的列进行分组。如果您考虑如何显示结果,那么您应该知道所有列应该在组中:

SELECT
    REC.REC_Id_I,
    REC.REC_No_V,
    CUS.CUS_Name_V,
    REC.REC_PaidAmount_M,
    CASE
        WHEN REC.REC_PayMode_C = 'C' THEN 'Cash'
        ELSE 'Cheque'
    END AS REC_PayMode_C,
    REC.REC_BankName_V,
    REC.REC_BankAddress,
    REC.REC_ChequeNo_V,
    convert(varchar, REC.REC_ChequeDate_D, 103) AS REC_ChequeDate_D,
    REC.REC_Date_D,
    MAX(REC.REC_Id_I) As RECID
FROM TBL_Receipts REC
JOIN TBL_CustomerMaster CUS ON REC.REC_CustomerId_I = CUS.CUS_Id_I
WHERE
  REC_Active_c='y'
  AND REC_SalesMasterId_I='0'
 GROUP BY 
    REC.REC_Id_I,
    REC.REC_No_V,
    CUS.CUS_Name_V,
    REC.REC_PaidAmount_M,
    CASE
        WHEN REC.REC_PayMode_C = 'C' THEN 'Cash'
        ELSE 'Cheque'
    END AS REC_PayMode_C,
    REC.REC_BankName_V,
    REC.REC_BankAddress,
    REC.REC_ChequeNo_V,
    convert(varchar, REC.REC_ChequeDate_D, 103) AS REC_ChequeDate_D,
    REC.REC_Date_D
ORDER BY REC_Id_I

答案 2 :(得分:0)

添加GROUP BY子句时会出现什么错误?永远不要写错误,总是写下错误。

我不知道您是如何使用GROUP BY子句编写查询的(因为您还没有向我们展示),但请尝试这样做:

SELECT
    REC.REC_Id_I,
    REC.REC_No_V,
    CUS.CUS_Name_V,
    REC.REC_PaidAmount_M,
    CASE
        WHEN REC.REC_PayMode_C = 'C' THEN 'Cash'
        ELSE 'Cheque'
    END AS REC_PayMode_C,
    REC.REC_BankName_V,
    REC.REC_BankAddress,
    REC.REC_ChequeNo_V,
    convert(varchar, REC.REC_ChequeDate_D, 103) AS REC_ChequeDate_D,
    REC.REC_Date_D,
    MAX(REC.REC_Id_I) As RECID
FROM TBL_Receipts REC
JOIN TBL_CustomerMaster CUS ON REC.REC_CustomerId_I = CUS.CUS_Id_I
WHERE
  REC_Active_c='y'
  AND REC_SalesMasterId_I='0'
GROUP BY
  REC.REC_Id_I,
  REC.REC_No_V,
  CUS.CUS_Name_V,
  REC.REC_PaidAmount_M,
  CASE
      WHEN REC.REC_PayMode_C = 'C' THEN 'Cash'
      ELSE 'Cheque'
  END,
  REC.REC_BankName_V,
  REC.REC_BankAddress,
  REC.REC_ChequeNo_V,
  convert(varchar, REC.REC_ChequeDate_D, 103),
  REC.REC_Date_D
ORDER BY REC_Id_I;

答案 3 :(得分:0)

通过使用select语句我解决了我的问题

Code is:

 SELECT 
    REC.REC_Id_I,
    REC.REC_No_V,
    CUS.CUS_Name_V,
    REC.REC_PaidAmount_M,
     CASE WHEN REC.REC_PayMode_C='C' THEN 'Cash' ELSE 'Cheque' END AS REC_PayMode_C,
     REC.REC_BankName_V,
    REC.REC_BankAddress,
    REC.REC_ChequeNo_V,
    convert(varchar, REC.REC_ChequeDate_D, 103) AS REC_ChequeDate_D,
     REC.REC_Date_D,`(SELECT MAX(REC_Id_I) from TBL_Receipts) AS RECID` 
    FROM TBL_Receipts REC  
    JOIN TBL_CustomerMaster CUS 
    on  REC.REC_CustomerId_I=CUS.CUS_Id_I where REC_Active_c='y' and REC_SalesMasterId_I='0'
    ORDER BY REC_Id_I 

答案 4 :(得分:0)

要计算聚合函数并获取相应的列值,您必须拥有GROUP BY中的所有其他列(除了计算聚合的那些列)。

SELECT table_1.column_A,
       MAX(table_2.column_B),
       table_2.column_C

FROM table_1
     INNER JOIN table_2   ON table_1.column_A=table_2.column_B

GROUP BY table_1.column_A,
         table_2.column_C
相关问题