我想创建一个从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子句中。
答案 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