使用函数 SUM() 和 Group by 将 Mysql 查询转换为 SQL 查询

Posted

技术标签:

【中文标题】使用函数 SUM() 和 Group by 将 Mysql 查询转换为 SQL 查询【英文标题】:Convert Mysql Query to SQL query with function SUM() and Group by 【发布时间】:2019-09-26 11:32:15 【问题描述】:

我有 mysql 查询,所以我想转换成 MS SQL 服务器查询。 当我尝试转换时发生错误: ColumnName 在选择列表中无效,因为它既不包含在聚合函数中,也不包含在 GROUP BY 子句中。

我已经尝试过,但无法将类似的输出显示为 Mysql 查询

//Mysql Query Execute Proparly:
select lm.*,fm.Fund_Name from (select max(id) Id,Office_Id,max(Fund_Key) 
Fund_Key, Return_Month,Tax_Payer_GST,Tax_Payer,
Tax_Payer_asPer_GST, SUM(User_Tot_Gross) 
User_Tot_Gross,SUM(System_Tot_Gross) System_Tot_Gross,
SUM(IGST) IGST, SUM(CGST) CGST,SUM(SGST) SGST,SUM(TAX_Payble) 
TAX_Payble,SubmittedStatus 
from ledger_master WHERE STATUS='Active' group by 
Return_Month,Tax_Payer_GST,Office_Id,Tax_Payer,Tax_Payer_asPer_GST, 
SubmittedStatus)
lm left join office_master om on lm.Office_Id=om.Id 
left join fund_master fm on lm.Fund_Key=fm.Fund_Key  
WHERE om.GSTNo='27ABCPD1234E1Z1'

//SQL Server Query execute but not showing result properly :
SELECT lm.Id,lm.Office_Id,lm.Fund_Key,lm.Return_Month,lm.Tax_Payer_GST,
lm.Tax_Payer, 
lm.Tax_Payer_asPer_GST,SUM(lm.User_Tot_Gross) User_Tot_Gross,
SUM(lm.System_Tot_Gross) System_Tot_Gross,SUM(lm.IGST) IGST,
SUM(lm.CGST) CGST,SUM(lm.SGST) SGST,SUM(lm.TAX_Payble) TAX_Payble,
fm.Fund_Name,lm.SubmittedStatus 
FROM ledger_master AS lm  INNER JOIN fund_master AS fm ON 
fm.Fund_Key=lm.Fund_Key  
INNER JOIN office_master AS om ON om.Id=lm.Office_Id  
WHERE lm.Status='Active' AND om.GSTNo='27ABCPD1234E1Z1' 
GROUP BY lm.tax_Payer_GST,lm.Fund_Key,lm.Return_Month,lm.SubmittedStatus

【问题讨论】:

您提到了一个要转换的查询,但您的问题有两个查询。我很困惑。 一次运行一个查询并检查哪个查询引发了错误! 第一个查询在 mySql 和第二个 SQL 第一个查询正常执行,但第二个查询无法将结果显示为 mysql 查询, 但没有正确显示结果 ...对我们没有帮助。没有记录?太少还是太多?分组错误?请告诉我们为什么查询会返回不想要的结果。 【参考方案1】:

此错误出现在您的第二个查询中,MySQL 上的旧版本允许您逃脱,但新版本和其他 RDBMS(如 SQL Server)不允许。

问题是您有一个 GROUP BY 语句将聚合所有结果,以便每个组有一行,但是您的 SELECT 子句中的字段既不是包含在聚合函数中,也不是 GROUP 的一部分BY 子句。问题是,如果一个字段不满足这两个条件,SQL 无法确定您要为该字段返回哪个值,因为有多种可能性 - 组中的每个成员都有一种可能性。

您的 MySQL 版本只是选择它遇到的第一个值来解决此问题,这很糟糕,因为如果说数据库中的行顺序发生变化,理论上它可能在查询的不同执行之间有所不同。

进一步解释错误信息:

如果该字段是GROUP BY 语句的一部分,那很好,因为 这些组由字段的每个唯一值标识,因此 SQL 永远不必选择一个值。 如果字段包含在聚合函数中,例如您的 SUM 例如,所有可能的值都减少到一个值 确定性 - 在 SUM 的情况下,它们都加在一起。

要解决这个问题,首先看看你的查询中有哪些字段不满足这些条件。在我看来,它包括以下字段:

lm.Id,
lm.Office_Id,
lm.Tax_Payer, 
lm.Tax_Payer_asPer_GST,
fm.Fund_Name

对于这些字段中的每一个,您都有三种可能的解决方案:

将该字段添加到 GROUP BY 子句。这可能是适当的做法,但可能不是因为它会根据字段的不同可能值将您当前的组分成更小的组。 用聚合函数将每个字段括起来。如果您真的不在乎返回哪些可能的值,您可以在每个字段周围使用MINMAX 来确定性地选择第一个或最后一个。或者,找到更合适的聚合函数来选择您想要的值。 如果您确实不需要该字段,请从查询中删除该字段。

【讨论】:

感谢@RobStreeting 在需要所有字段但没有按 lm.Id、lm.Office_Id、lm.Tax_Payer、lm.Tax_Payer_asPer_GST 分组时的回复,此列只是将列名放入错误ocur ColumnName 在选择列表中无效,因为它既不包含在聚合函数中,也不包含在 GROUP BY 子句中。然后我在那个聚合函数中使用了。【参考方案2】:

我认为 ALL 选择中的非聚合字段(lm.id、lm.office_id、...我数了其中九个)必须在 group by 子句中。到目前为止,您的 group by 仅包含其中四个。

因此,您可能想尝试一下:

//SQL Server Query execute but not showing result properly :
SELECT lm.Id,lm.Office_Id,lm.Fund_Key,lm.Return_Month,lm.Tax_Payer_GST,
lm.Tax_Payer, 
lm.Tax_Payer_asPer_GST,SUM(lm.User_Tot_Gross) User_Tot_Gross,
SUM(lm.System_Tot_Gross) System_Tot_Gross,SUM(lm.IGST) IGST,
SUM(lm.CGST) CGST,SUM(lm.SGST) SGST,SUM(lm.TAX_Payble) TAX_Payble,
fm.Fund_Name,lm.SubmittedStatus 
FROM ledger_master AS lm  INNER JOIN fund_master AS fm ON 
fm.Fund_Key=lm.Fund_Key  
INNER JOIN office_master AS om ON om.Id=lm.Office_Id  
WHERE lm.Status='Active' AND om.GSTNo='27ABCPD1234E1Z1' 
GROUP BY lm.tax_Payer_GST,lm.Fund_Key,lm.Return_Month,lm.SubmittedStatus,fm.fund_name,lm.id,lm.office_id,lm.tax_payer,lm.tax_payer_asper_gst

【讨论】:

感谢@Oceansunfish 的回复,但我不想在 lm.Tax_Payer、lm.Tax_Payer_asPer_GST 上进行分组,但会显示在结果中。这是表中的唯一字段,所以我要做什么

以上是关于使用函数 SUM() 和 Group by 将 Mysql 查询转换为 SQL 查询的主要内容,如果未能解决你的问题,请参考以下文章

聚合函数 和 group by

Drupal 使用 group by 和 sum 查看查询

不能在 Group by/Order by/Where/ON 子句中使用 Group 或 Aggregate 函数(min()、max()、sum()、count()、...等)

SQL 3加入group by和sum函数[重复]

GROUP BY 和聚合函数的参数的适当术语,例如 SUM()

如何在 SWIFT 的 IOS CORE-DATA 请求中使用 SQL GROUP BY 和 SUM 函数?