Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2006.03.12;
Скачать: [xml.tar.bz2];

Вниз

Access, ADO   Найти похожие ветки 

 
Е.   (2006-01-14 09:39) [0]

Есть таблица [ОбъемРабот] с полями:

[КодЦеха] - Длинное целое
[КодРаботы] - Длинное целое
[Январь] - Одинарное с плавающей точкой
[Февраль] - Одинарное с плавающей точкой
...
[Декабрь] - Одинарное с плавающей точкой.

Месяца в таблице обозначают объем данной работы КодРаботы), выполненной данным цехом(КодЦеха) в данном месяце.

Необходимо подсчитать суммарный объем по каждой работе за год всего предприятия. Я делаю запрос:

SELECT
 SUM(Январь+Февраль+...+Декабрь) AS [Объем],
 КодРаботы
FROM
 ОбъемРабот
GROUP BY
 КодРаботы;

и получаю неправильный результат (некоторые значения равны нулю). В справке MS Access сказано, что "Функция Sum пропускает записи с полями, содержащим значения Null". Если дело в этом, то каким образом можно это обойти? Или запрос составлен неверно?


 
sniknik ©   (2006-01-14 09:50) [1]

> Если дело в этом, то каким образом можно это обойти?
SUM(iif(IsNull([Январь]),0,[Январь])+...)
или
SUM([Январь])+SUM([Февраль])+...


 
Е.   (2006-01-14 10:08) [2]

Тот же результат.


 
Е.   (2006-01-14 10:09) [3]

Тот же результат во втором варианте.


 
Е.   (2006-01-14 10:37) [4]

А вот первый вариант работает, правда несколько громоздко выглядит, но работает. Спасибо.
PS. Остается ощущение, что можно как-то упростить. Или нет?


 
Е.   (2006-01-14 10:45) [5]

Интересно, функция SUM везде так странно работает или только в MS Access?


 
sniknik ©   (2006-01-14 10:48) [6]

> Тот же результат во втором варианте.
по идее не должно
приведи второй вариант полностью, как ты его написал.


 
sniknik ©   (2006-01-14 10:51) [7]

> Интересно, функция SUM везде так странно работает или только в MS Access?
это не SUM это правила Null -> 1 +  Null = Null (и вообще любое число + Null)
будет везде аналогично, правда с исключениями... (в MSSQL например это поведение настраиваемо, по умолчанию также (на тех установках mssql что я делал))


 
sniknik ©   (2006-01-14 11:01) [8]

а понял. у тебя же там группировка, т.е. SUM-мируются небольшие группы значений, и наверное попадает что вся группа по какомуто месяцу из значений Null ... тогда и вся сумма Null и сложение сумм где есть хоть одна с Null даст Null ...
 
"неправильный результат" это пропуски да? (пустые значения). если да то все верно, и второй тебе не подойдет.


 
Е.   (2006-01-14 11:09) [9]


> sniknik ©   (14.01.06 11:01) [8]
> а понял. у тебя же там группировка, т.е. SUM-мируются небольшие
> группы значений, и наверное попадает что вся группа по какомуто
> месяцу из значений Null ... тогда и вся сумма Null и сложение
> сумм где есть хоть одна с Null даст Null ...
>  
> "неправильный результат" это пропуски да? (пустые значения).
>  если да то все верно, и второй тебе не подойдет.


Да именно так. Еще раз спасибо.


 
Anatoly Podgoretsky ©   (2006-01-14 12:51) [10]

sniknik ©   (14.01.06 10:48) [6]
sniknik ©   (14.01.06 11:01) [8]

Это не важно, даже в пределах одной записи результат будет NULL если хотя бы одно из полей NULL
Только первый вариант даст нужный результат, преобразование NULL в 0

Е.   (14.01.06 10:37) [4]
А ты столбиком запиши, будет и красиво и понятно.


 
sniknik ©   (2006-01-14 13:09) [11]

Anatoly Podgoretsky ©   (14.01.06 12:51) [10]
> Это не важно, даже в пределах одной записи результат будет NULL если хотя бы одно из полей NULL
так именно это я и сказал... сумма в "линейку" дает Null ...
но т.к. в [6]/[8] рассматривался второй вариант (SUM([Январь])+SUM([Февраль])+...) то тут сначала складываются "столбики" и до строки Null "дойдет" только если весь столбец из Null. (в "столбиках" Null просто пропускается)

> Только первый вариант даст нужный результат, преобразование NULL в 0
если много значений и гарантированно хоть одно поле каждого столбца проинициализировано (есть значение), то и второй вариант сработает.

p.s. ктото когото не понял...


 
Е.   (2006-01-15 11:12) [12]

Нашлась некая функция Nz в MS Access, с ней запрос выглядит "красивее и понятнее":

SELECT
 SUM(Nz(Январь)+Nz(Февраль)+..+Nz(Декабрь)) AS Объем,
 КодРаботы
FROM
 ОбъемРабот
GROUP BY КодРаботы;

...но работает почему-то только непосредственно в Access. Если использовать через ADOQuery.Sql выдает ошибку: "Неопределенная функция "Nz" в выражении." Почему?


 
sniknik ©   (2006-01-15 13:32) [13]

> ...но работает почему-то только непосредственно в Access.
т.к. это функция самого приложения (Application), а не jet (он только встроенный бейсик может использовать, но не функции описаные в разных "левых" программах)

иллюстрация
unit AccessAppUnit;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, AccessXP, ComObj;

type
 TForm1 = class(TForm)
   Button1: TButton;
   Button2: TButton;
   Label1: TLabel;
   procedure FormCreate(Sender: TObject);
   procedure Button1Click(Sender: TObject);
   procedure Button2Click(Sender: TObject);
 private
   TestNull: OleVariant;
 public
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
 TestNull:= Null;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
 appAccess: _Application;
begin
 appAccess:= CreateComObject(CLASS_AccessApplication) as _Application;
 try
   Label1.Caption:= appAccess.Nz(TestNull, "NULL");
 finally
   appAccess:= nil;
 end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
 TestNull:= "NOT NULL";
end;

end.



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2006.03.12;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.012 c
2-1140541048
Wel
2006-02-21 19:57
2006.03.12
C++Builder


15-1140045550
Диззайнер
2006-02-16 02:19
2006.03.12
Как можно подключить к компу ломпочки и управлять ими?


2-1140427780
nap<>
2006-02-20 12:29
2006.03.12
TPageControl


2-1138597593
maxim161
2006-01-30 08:06
2006.03.12
ClientSocket&amp;ServerSocket


15-1140187686
kaZaNoVa
2006-02-17 17:48
2006.03.12
Мониторинг и анализ передаваемой Браузером информации





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский