Sql 如何在联接查询中使用MAX()
我想创建一个查询,从recit表中获取RECID,它是Customer表中的custname和recit上的最大RECID。但不知何故,这个查询抛出了一个错误。它始于我将maxMAXREC.REC_Id_I添加为RECID时 查询是:Sql 如何在联接查询中使用MAX(),sql,sql-server,Sql,Sql Server,我想创建一个查询,从recit表中获取RECID,它是Customer表中的custname和recit上的最大RECID。但不知何故,这个查询抛出了一个错误。它始于我将maxMAXREC.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 = '
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
错误是:
Msg 8120,级别16,状态1,程序sp_Receivement_Select,第15行列“TBL_Receives.REC_Id_I”在选择列表中无效,因为它不包含在聚合函数或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 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
添加GROUPBY子句时会出现什么错误?永远不要写你有错误,总是写错误是什么 我不知道您是如何使用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;
如果您的GROUPBY子句仍然存在问题,您可以尝试类似的方法,即使这不是最佳解决方案,它也应该可以工作
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
通过使用select语句,我解决了我的问题 代码是:
若要计算聚合函数并获取相应的列值,必须将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
MSSQL不是MySQL。您需要显式地按列分组。@Juhana错误消息表明它是MSSQL。MySQL只是隐式地按列分组。就像在其他地方使用GROUP BY一样。我使用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