Конвертировать Mysql Query в SQL-запрос с помощью функции SUM () и сгруппировать по - PullRequest
0 голосов
/ 26 сентября 2019

У меня есть MySql Query, поэтому я хочу преобразовать в запрос MS SQL Server.когда я пытаюсь преобразовать, возникает ошибка: имя столбца недопустимо в списке выбора, потому что оно не содержится ни в статистической функции, ни в предложении GROUP BY.

Я уже пробовал, но не могу показать вывод silimar как запрос 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

Ответы [ 2 ]

0 голосов
/ 26 сентября 2019

Эта ошибка во втором запросе, и что-то, с чем старые версии MySQL позволяют вам обойтись, но более новые версии и другие СУБД (например, SQL Server) не позволяют.

Проблема в том, чтоу вас есть оператор GROUP BY, который агрегирует все ваши результаты, чтобы в каждой группе была одна строка, но у вас есть поля в предложении SELECT, которые не включены ни в агрегатные функции, ни в часть предложения GROUP BY.Проблема состоит в том, что если поле не удовлетворяет ни одному из этих условий, SQL не может определить, какое значение вы хотите вернуть для этого поля, поскольку существует несколько возможностей - по одной для каждого члена группы.

Ваша версияMySQL просто выбирает первое значение, с которым сталкивается, чтобы решить эту проблему, и это плохо, поскольку теоретически оно может отличаться в зависимости от выполнения каждого запроса, если, например, порядок строк изменяется в базе данных.

Чтобы объяснить ошибкусообщение немного дальше:

  • Если поле является частью оператора GROUP BY , это нормально, потому что группы идентифицируются каждым уникальным значением поля, поэтому SQL никогда не будетдолжен выбрать значение.
  • Если поле заключено в агрегатную функцию , как, например, SUM в вашем примере, все возможные значения будут детерминировано сведены к одному значению - в случаеСУММЫ, они все складываются вместе.

Чтобы решить эту проблему, сначала взгляните на which поля в вашем запросе не соответствуют этим условиям.Мне кажется, что это включает в себя следующие поля:

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

У вас есть три возможных решения для каждого из этих полей:

  • Добавить поле в предложение GROUP BY,Это может быть правильным решением, но, скорее всего, это не потому, что оно разделит ваши текущие группы на более мелкие группы по различным возможным значениям поля.
  • Заключите каждое из этих полей с помощью функции агрегирования.Если вам действительно все равно, какое из возможных значений возвращается, вы можете использовать MIN или MAX вокруг каждого поля, чтобы выбрать первое или последнее детерминистически.Или найдите более подходящую статистическую функцию для выбора нужных значений.
  • Удалите поле из запроса, если оно вам там не нужно.
0 голосов
/ 26 сентября 2019

Я думаю, ALL ваших неагрегированных полей в select (lm.id, lm.office_id, ... я считаю девять из них) должны быть в предложении 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...