Синтаксическая ошибка sum

MS Access doesn’t support case. Use iif() instead:

SELECT CompanyCode, PaymentStatus, PaymentType, PaySource,    
       SUM(CCur(PaymentAmount)),
       SUM(IIF(PaymentStatus = 'APPROVED', 1, 0)) AS Approved,  COUNT(*) 
FROM Detail_Work 
GROUP BY CompanyCode,PaymentType, PaymentStatus, PaySource 
ORDER BY CompanyCode, PaymentType, PaymentStatus, PaySource;

However, I’m not sure why you have PaymentStatus in the GROUP BY. Perhaps you intend:

SELECT CompanyCode, PaymentType, PaySource,    
       SUM(CCur(PaymentAmount)),
       SUM(IIF(PaymentStatus = 'APPROVED', 1, 0)) AS Approved,  COUNT(*) 
FROM Detail_Work 
GROUP BY CompanyCode,PaymentType, PaySource 
ORDER BY CompanyCode, PaymentType, PaySource;

I am trying to run the following query and I am getting the following error:

You have an error in your SQL syntax; check the manual that
corresponds to your MySQL server version for the right syntax to use
near ‘sum(sl.duration) as duration, sum(sl.quantity_loss) as
quantity_loss’

SELECT 
   lr.uid AS loss_reason_uid,
   gl.uid AS gl_uid,
   lt.uid AS lt_uid,
   SUM(sl.duration * b.marginal_value_downtime) AS value_loss where en.state = 'downtime',
   SUM(sl.quantity_loss * p.marginal_value) as value_loss where en.state != 'downtime',
   SUM(sl.duration) AS duration,
   SUM(sl.quantity_loss) AS quantity_loss,
   COUNT(*) AS count
FROM
    sub_losses AS sl

Any idea why is this syntax error occurring?

Mark Rotteveel's user avatar

asked Dec 4, 2017 at 10:07

aryan87's user avatar

4

TRY THIS: Except above comments it is not allowed to use same ALIAS or COLUMN NAME more than once in a single block of query so I have given value_loss1 to make is unique.

SELECT 
   lr.uid AS loss_reason_uid,
   gl.uid AS gl_uid,
   lt.uid AS lt_uid,
   SUM(CASE WHEN en.state = 'downtime' THEN (sl.duration * b.marginal_value_downtime) ELSE 0 END) AS value_loss,
   SUM(CASE WHEN en.state != 'downtime' THEN (sl.quantity_loss * p.marginal_value) ELSE 0 END) AS value_loss1,
   SUM(sl.duration) AS duration,
   SUM(sl.quantity_loss) AS quantity_loss,
   COUNT(*) AS count
FROM sub_losses AS sl
GROUP BY lr.uid,
         gl.uid,
         lt.uid

answered Dec 4, 2017 at 10:37

Shushil Bohara's user avatar

Shushil BoharaShushil Bohara

5,5562 gold badges15 silver badges32 bronze badges

1

This worked for me. Thanks @HoneyBadger for guiding.

SELECT 
    lr.uid AS loss_reason_uid,
        gl.uid AS gl_uid,
        lt.uid AS lt_uid,
        SUM(CASE WHEN en.state = 'downtime' THEN sl.duration * b.marginal_value_downtime ELSE sl.quantity_loss * p.marginal_value END) AS value_loss,
        SUM(sl.duration) AS duration,
        SUM(sl.quantity_loss) AS quantity_loss,
        COUNT(*) AS count
FROM
    sub_losses AS sl

answered Dec 4, 2017 at 11:34

aryan87's user avatar

aryan87aryan87

1191 silver badge12 bronze badges

1

  • Remove From My Forums
  • Question

  • i’m new to SQL and still learning, but this error has me really confused.

    i wrote a basic query:

    select *

    from [grant]

    compute sum(Amount)

    however, i keep receiving this error:

    Msg 156, Level 15, State 1, Line 6

    Incorrect syntax near the keyword ‘compute’.

    the code runs fine without the compute statement. there are no nulls and Amount is a numeric field. i tried the compute sum() function on different tables and i always get the same error. any help would be much appreciated as i can’t proceed in my book until
    i resolve this.

    • Moved by

      Tuesday, July 3, 2012 7:08 PM
      (From:Getting started with SQL Server)

Answers

  • What version of SQL Server are you using?  The COMPUTE keyword was recently deprecated in SQL Server 2012.  If you are trying to just get the sum, you could return it in your select statement:

    select sum(Amount)
    from [grant]
    

    Thanks,
    Sam Lester (MSFT)


    This posting is provided «AS IS» with no warranties, and confers no rights. Please remember to click «Mark as Answer» and «Vote as Helpful» on posts that help you. This can be beneficial to other community members reading
    the thread.

    • Proposed as answer by
      R. Maier
      Wednesday, July 11, 2012 7:39 AM
    • Marked as answer by
      Naomi N
      Monday, November 5, 2012 3:01 AM

  • In this case this is the answer — COMPUTE command is deprecated in SQL 2012, so you can not use it. You need to use

    More to the point, COMPUTE has been deprecated since God knows when. In SQL 2012 it was removed.

    A deprecated feature is a feature that still exists, but which is slated for removal at some point in the future and therefore should be avoided.

    I will have to admit having use COMPUTE for ad hoc queries when I have been lazy, but it was a completely crazy feature, so there no reason to deplore its disappearance.


    Erland Sommarskog, SQL Server MVP, esquel@sommarskog.se

    • Proposed as answer by
      Satheesh Variath
      Wednesday, July 4, 2012 6:31 AM
    • Marked as answer by
      amber zhang
      Wednesday, July 11, 2012 7:15 AM

  • In this case this is the answer — COMPUTE command is deprecated in SQL 2012, so you can not use it. You need to use

    select sum(Amount) as TotalAmount from [Grant]


    For every expert, there is an equal and opposite expert. — Becker’s Law

    My blog

    • Marked as answer by
      Kalman Toth
      Monday, November 5, 2012 2:25 PM

    • Proposed as answer by
      Naomi N
      Tuesday, July 3, 2012 7:24 PM
    • Marked as answer by
      Kalman Toth
      Monday, November 5, 2012 2:24 PM
  • The COMPUTE clause was an old 1970’s Sybase  feature that was removed in 2012. However, look at the ROLLUP and CUBE we today. They are ANSI Srandard. 


    —CELKO— Books in Celko Series for Morgan-Kaufmann Publishing: Analytics and OLAP in SQL / Data and Databases: Concepts in Practice Data / Measurements and Standards in SQL SQL for Smarties / SQL Programming Style / SQL Puzzles and Answers / Thinking
    in Sets / Trees and Hierarchies in SQL

    • Proposed as answer by
      Naomi N
      Tuesday, July 3, 2012 8:54 PM
    • Marked as answer by
      amber zhang
      Wednesday, July 11, 2012 7:15 AM

Я пытаюсь запустить следующий запрос, и я получаю следующую ошибку:

У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом с sum (sl.duration) в качестве продолжительности, sum (sl.quantity_loss) как quantity_loss ‘

SELECT 
   lr.uid AS loss_reason_uid,
   gl.uid AS gl_uid,
   lt.uid AS lt_uid,
   SUM(sl.duration * b.marginal_value_downtime) AS value_loss where en.state = 'downtime',
   SUM(sl.quantity_loss * p.marginal_value) as value_loss where en.state != 'downtime',
   SUM(sl.duration) AS duration,
   SUM(sl.quantity_loss) AS quantity_loss,
   COUNT(*) AS count
FROM
    sub_losses AS sl

Любая идея, почему возникает синтаксическая ошибка?

04 дек. 2017, в 11:45

Поделиться

Источник

2 ответа

Это сработало для меня. Спасибо @HoneyBadger за руководство.

SELECT 
    lr.uid AS loss_reason_uid,
        gl.uid AS gl_uid,
        lt.uid AS lt_uid,
        SUM(CASE WHEN en.state = 'downtime' THEN sl.duration * b.marginal_value_downtime ELSE sl.quantity_loss * p.marginal_value END) AS value_loss,
        SUM(sl.duration) AS duration,
        SUM(sl.quantity_loss) AS quantity_loss,
        COUNT(*) AS count
FROM
    sub_losses AS sl

aryan87
04 дек. 2017, в 10:01

Поделиться

ПОПРОБУЙТЕ ЭТО: За исключением вышеприведенных комментариев не разрешено использовать одни и ALIAS же ALIAS или COLUMN NAME более одного раза в одном блоке запроса, поэтому я дал value_loss1 чтобы сделать уникальным.

SELECT 
   lr.uid AS loss_reason_uid,
   gl.uid AS gl_uid,
   lt.uid AS lt_uid,
   SUM(CASE WHEN en.state = 'downtime' THEN (sl.duration * b.marginal_value_downtime) ELSE 0 END) AS value_loss,
   SUM(CASE WHEN en.state != 'downtime' THEN (sl.quantity_loss * p.marginal_value) ELSE 0 END) AS value_loss1,
   SUM(sl.duration) AS duration,
   SUM(sl.quantity_loss) AS quantity_loss,
   COUNT(*) AS count
FROM sub_losses AS sl
GROUP BY lr.uid,
         gl.uid,
         lt.uid

Susang
04 дек. 2017, в 09:15

Поделиться

Ещё вопросы

  • 0Как подключиться к сервису WCF с помощью Ionic project и angularjs
  • 1Android Веб-просмотр определенного содержимого страницы, чтобы увеличить по умолчанию
  • 1Хранение файлов на некоторых SD-картах в Windows Phone 8.1
  • 0как искать часть строки, а не все
  • 0FullText InnoDB Поиск без ответа
  • 1c # назначить кнопку пользовательское расположение на FlowLayoutPanel
  • 0нг-если внутри нг-повтор не обновляется с контроллера
  • 0Как представить символ двойных кавычек («) в регулярном выражении, используя CakePHP?
  • 1Шифрование сообщений чата, хранящихся в базе данных Firebase
  • 0Использование Jquery для поиска текста, содержащего скобки
  • 0извлечение элемента массива из присоединенного DQL-запроса в symfony2
  • 1ngModel не может правильно определить изменения массива
  • 0как выбрать ссылку в заголовке с помощью jquery
  • 0Вызовите PHP с JavaScript
  • 1Строки в pandas.Series всегда меньше 0?
  • 0Передать параметр в URL в JavaScript
  • 1UUID генерируется с использованием двух языков программирования?
  • 1Обновление пользовательского интерфейса до фактического выполнения метода
  • 0выберите строки, которые удовлетворяют где пункт И строки, которые имеют общий ключ
  • 1Самый простой способ проверить согласованность нескольких значений в списке объектов
  • 0угловой карма-жасмин юнит тест для контроллера
  • 0Как правильно пропинговать любой сайт с помощью angularjs [дубликата]
  • 1Как изменить значение логического значения при нажатии кнопки JButton
  • 1как использовать в заявлении в где предложение с помощью entitydatasource
  • 0Перезаписать вывод foreach, если существует повторяющееся значение
  • 0Передать параметры с помощью службы Angular resource
  • 0как получить последнюю строку из таблицы 2, используя левое соединение MySQL
  • 0Управление конфликтом событий в родительско-дочернем div
  • 0CodeIgniter Войти через Google OpenID
  • 0В пользовательском интерфейсе jQuery не работают вкладки пользовательского интерфейса jQuery (карта Google V3)
  • 1Панды — создать столбец на основе имен столбцов, на которые есть ссылки в другом столбце
  • 0Javascript Делегирование событий
  • 0Хранить индексы геометрии
  • 0angularjs of-controller внутри-контроллера
  • 0Как сохранить и восстановить данные представления при переключении между несколькими представлениями в AngularJs?
  • 0Базовый проект cloud9
  • 1Модель слежения / изображение исчезают при включенной автофокусировке
  • 0Как сделать косую черту URL после основного домена с помощью .htaccess
  • 0Привести итератор к другому типу
  • 0$ watch или проблема с привязкой к модели?
  • 0Использование другого интерфейса со структурой данных stl
  • 1Загрузка элементов из комнаты в MediaBrowserServiceCompat
  • 0Mysqli Ошибка 2002: нет такого файла или каталога
  • 0Сложный SQL-запрос с переменными
  • 0Показать всех пользователей всех подразделений в активном каталоге, используя adLDAP?
  • 0дополнительные элементы данных в объединенной структуре
  • 1Как бороться с большим массивом (100.000 объектов)?
  • 1Модуль Android Studio Gradle чистой установки дает ошибку com.android.volley не существует
  • 1как исправить E / RecyclerView: адаптер не подключен; проблема с пропуском макета
  • 0Как показать адрес электронной почты пользователя от MYSQL?

Сообщество Overcoder

Вопрос:

У меня есть таблица данных, а столбец содержит значения int. Я не указывал колонку с любым типом данных. Когда я выполняю следующее.

object sum = dttest.Compute("sum(Value)", "");

Я становлюсь ниже ошибки.

Недопустимое использование агрегатной функции Sum() и Type: String.

И я попытался преобразовать значение столбца в int используя

object sum = dttest.Compute("sum(Convert(Value, 'System.Int32'))","");

снова я получаю еще одну ошибку

Синтаксическая ошибка в агрегированном аргументе: ожидая один аргумент столбца с возможным квалификатором “Child”.

Когда я укажу тип данных для столбца, первый код вернет правильное значение. Но в моем случае я не могу указать тип столбца столбца. Любой, у кого есть решение?

Лучший ответ:

Вы можете использовать LINQ to Datatable:

 var result = dttest.AsEnumerable()
                    .Sum(x => Convert.ToInt32(x["Value"]));

Пример того, как Sum для определенного имени:

 var result = dttest.AsEnumerable()
                    .Where(r => r.Field<string>("Name") == "FilterName")
                    .Sum(x => Convert.ToInt32(x["Value"]));

Ответ №1

пытаться

object sum = dttest.Compute("Sum(Value)", "[Value] IS NOT NULL");

Образец кода

    static DataTable GetTable()
{
DataTable table = new DataTable();
table.Columns.Add("Value", typeof(int));
table.Columns.Add("Name", typeof(string));
table.Rows.Add(null, "a");
table.Rows.Add(50, "a");
table.Rows.Add(10, "a");
table.Rows.Add(21, "b");
table.Rows.Add(100, "b");
return table;
}
static void Main(string[] args)
{
DataTable dt =GetTable();
var str = dt.Compute("Sum(Value)", "Name='a' and Value is not null");
}

Вы не можете вызывать сумму с помощью Convert, но можете попробовать ниже

DataTable dt =GetTable();
dt.Columns.Add("temp", typeof(int), "Convert(Value, 'System.Int32')");
var str = dt.Compute("Sum(temp)", "Name='a' and Value is not null");

Ответ №2

пытаться

dttest.Compute("Sum(Convert([Value], 'System.Int32'))","[Value] IS NOT NULL");

Ответ №3

Когда программа попытается суммировать столбец данных, который объявлен как строка, эта ошибка возникает.
Используйте приведенный ниже код, чтобы выполнить операцию вычисления в столбце строки.

dtTable.Compute("Sum(Convert(" + col_Name + ", 'System.Int32')","");

Понравилась статья? Поделить с друзьями:
  • Синтаксическая ошибка rightbrace перед end of program
  • Синтаксическая ошибка public c
  • Синтаксическая ошибка private
  • Синтаксическая ошибка mprg
  • Синтаксическая ошибка lenovo