Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.03.12;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.026 c
3-1137990936
-Phoenix-
2006-01-23 07:35
2006.03.12
Ошибка при подсоединении к Ораклу ORA-12514


2-1140401767
rosl
2006-02-20 05:16
2006.03.12
ehlib


15-1140066507
КаПиБаРа
2006-02-16 08:08
2006.03.12
Школа программирования


6-1132918760
Dimedrol
2005-11-25 14:39
2006.03.12
Как выставить TwebBrowser-у UTF-8 кодировку ?


2-1141008211
Adios
2006-02-27 05:43
2006.03.12
BitButon