Страницы: 1
RSS
Суммирование в SQL запросе
 
Здравствуйте. Помогите с проблемой.  
 
Есть запрос:  
SELECT SUM(Column1) + SUM(Column2) AS Итог FROM Table  
 
Если столбец таблицы, Column1 или Column2, имеет все значения полей равные Null, Итог также будет Null, хотя в другом столбце есть данные(числа).  
Как составить запрос, что бы в Итог был действительно точный итог.
 
Логично. В SQL любое выражение с участие NULL будет давать NULL.  
 
Попробуйте:  
 
SELECT SUM(CASE WHEN Column1 IS NOT NULL THEN Column1 ELSE 0 END) +  
SUM(CASE WHEN Column2 IS NOT NULL THEN Column2 ELSE 0 END) AS "Итог" FROM Table;
 
насколько я помню в SQL есть функция IsNull, ее синтаксис такой:  
IsNull(ПровАрг, Знач) где  
ПровАрг - то что проверяется на равенство Null, в вашем случае Column1 или Column2;  
Знач - значение которое возвратит функция если ПровАрг = Null.  
 
То есть ваш пример будет выглядеть примерно так:  
SELECT SUM(IsNull(Column1,0)) + SUM(IsNull(Column2,0)) AS Итог FROM Table  
Пробуйте.  
ЗЫ: так и не понял каким боком вопрос касается Ексель ))
Редко но метко ...
 
К сожалению не один метод не хочет работать, выдает ошибку синтаксиса.  
Код пишется в VBA Exxel 2003? ядро БД - Microsoft.Jet.OLEDB.4.0
 
У меня IsNull работает без проблем, может у вас в другом месте запроса ошибка?    
Или давайте запрос сюда, посмотрим на него.
Редко но метко ...
 
В исходном вареанте работает:  
 
 Dim conBD As New Connection  
 Dim rstBD As New Recordset  
 
 'открыть соединение  
 strCon = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & FileName  
 conBD.Open strCon 'открыть соединение с БД  
'строка запроса  
sSQL="SELECT sWidRub, SUM(nDel), SUM(nDrw), SUM(nDel)+SUM(nDrw) AS nWsego" & _  
" FROM Pacx GROUP BY sWidRub"  
 
rstBD.Open sSQL, conBD 'Recordset  
-----  
sSQL="SELECT sWidRub, SUM(nDel), SUM(nDrw), SUM(IsNull(nDel,0))+" & _  
"SUM(IsNull(nDrw,0)) AS nWsego FROM Pacx GROUP BY sWidRub"  
А эта строка запроса выдает ошибку: "Неверное число аргументов в выражении запроса 'SUM(IsNull(nDel,0))'"
 
Однако на первый взгляд ошибок не видно, рекомендую попробовать упростить запрос для выявления ошибки, например запросите сначала так:  
 
sSQL="SELECT IsNull(nDel,0)FROM Pacx"  
если пройдет, то так:  
sSQL="SELECT SUM(IsNull(nDel,0))FROM Pacx"  
 
ну и так далее по наростающей.
Редко но метко ...
 
Я пробовал упростить. Решил проблему другой функцией:  
 
SUM(IIf(IsNull(nDel),0,nDel))  
 
функция IsNull - это логическая функция, резуьтвт Boolean  
синтаксис IsNull(nDel). Если Null, то True  
 
Всем СПАСИБО!
 
По моему мнению вы путаете функцию IsNull() и выражение is null (выражение пишется с пробелом). Именно выражение дает логическое значение!
Редко но метко ...
 
выражение is null: http://msdn.microsoft.com/en-us/library/ms188795.aspx  
функция IsNull(): http://msdn.microsoft.com/ru-ru/library/ms184325.aspx
Редко но метко ...
 
Похоже, функция IsNull работает так только на SQL сервере.  
Вот, например, разница в использовании этой ф-ии на SQL Server и MySQL:  
http://www.1keydata.com/sql/sql-isnull.html
 
{quote}{login=Казанский}{date=01.03.2011 05:09}{thema=GIG_ant}{post}Похоже, функция IsNull работает так только на SQL сервере.  
Вот, например, разница в использовании этой ф-ии на SQL Server и MySQL:  
http://www.1keydata.com/sql/sql-isnull.html{/post}{/quote}  
 
да действительно у меня SQL сервер
Редко но метко ...
 
В "Справочник Microsoft Jet SQL" (JETSQL40.CHM) сказано: "Для выполнения простых арифметических операций и вычисления значений функций в ядре базы данных Microsoft Jet используется служба выражений языка Microsoft® Visual Basic® для приложений (VBA)". А в VBA ведь IsNull() логическое. Наверное это и есть связь.
 
Есть такая функция в оракле как NVL, которая заменяет Null значения на то, что вам надо. Думаю и в вашей СУБД есть такая функция. Null это по сути ничего, и любая операция с Null, будет выводить опять же Null.  
 
SELECT SUM(NVL(Column1,0)) + SUM(NVL(Column2,0)) AS Итог FROM Table
 
С NVL тоже не желает работать
 
Да, IsNull выражение исключительно для T-SQL. Наиболее универсальное выражение было написано мною несколько выше.
Страницы: 1
Наверх