Главная страница
    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-1140856245
TAK
2006-02-25 11:30
2006.03.12
TPen


8-1128180544
alsov
2005-10-01 19:29
2006.03.12
Как программно сделать mute


15-1140349376
Jim27
2006-02-19 14:42
2006.03.12
Виснет компьютер


2-1140886737
LostHero
2006-02-25 19:58
2006.03.12
TrackBar для Видео Плеера


1-1138785708
Kolan
2006-02-01 12:21
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский