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

Вниз

Люди HELP плиз!!! Проблема с вычислением ТОТАЛ-а...   Найти похожие ветки 

 
DBDev   (2003-07-02 09:52) [0]

Запрос типа :
SELECT Поле1, Поле2, dbo.Функция(Поле3) AS Поле4 FROM Таблица

Надо сосчитать Сумму по полю 4.
Используемая компонента TADOQuery.

Вопрос1: В TADOQuery:OnCalcFields Делаю
Знач = Знач + Поле4;

В результате получаю искомое т.е. сумму по полю 4, НО почемы-то на всех компах кроме моего это значение вычисляется ОШИБОЧНО. НА МОЕМ ВСЕ СХОДИТСЯ.

Посему:

Вопрос2: Может что-нить связанное с нехватанием каких-то патчей для работы программы на компе где НЕТ Дельфей/Билдера?

И:

Вопрос 3: А как посчитать требуемое значение в самом запросе?

Вопрос 4: и насколько это будет правильней с точки зрения производительности?


 
Johnmen ©   (2003-07-02 09:59) [1]

1. Что есть Знач ?
2. Нет.
3. ..., SUM(dbo.Функция(Поле3)) AS СуммаПоПоле4 ...
4. намного


 
DBDev   (2003-07-02 10:04) [2]

2 JohnMen:

1. double Знач;
Знач = Знач + Поле4->AsFloat;

3.
В результате во вьюшке вылетает ошибка:

Coulumn Поле3 is invalid in the select clause because it is not contained in an agregate function and there is no GROUP BY clause.


 
Zacho ©   (2003-07-02 10:08) [3]


> DBDev (02.07.03 10:04)

Почитай что-нибудь по SQL, агрегатным функциям и GROUP BY.
И, не совсем понятно, что именно тебе надо получить в результате. Подозреваю, что тебе нужен отдельный запрос типа SELECT SUM(dbo.Функция(Поле3)) AS Сумма_Поле4 FROM Таблица



 
DBDev   (2003-07-02 10:11) [4]

2 Zacho: Таких тоталов мне считать 8 штук. Полагаю, что выполнять 8 дочерних запросов - не правильно!


 
Zacho ©   (2003-07-02 10:14) [5]


> DBDev (02.07.03 10:11)

Ты бы все-таки написал, какой именно резалтсет тебе надо получить. А так - гадание на кофейной гуще. И почитай все-таки документацию по агрегатным функциям.


 
DBDev   (2003-07-02 10:24) [6]

CREATE VIEW dbo.BudjetsMain
AS
SELECT BudjetID, ClientID, dbo.GetClient(ClientID) AS Client, dbo.GetResp(RespID) AS Responsible, DateFrom, DateTo, dbo.GetPrixod(BudjetID) AS Prixod,
dbo.GetPolucheno(BudjetID) AS Polucheno, dbo.GetPrixod(BudjetID) - dbo.GetPolucheno(BudjetID) AS Debet, dbo.GetRasxod(BudjetID) AS Rasxod,
dbo.GetOplacheno(BudjetID) AS Oplacheno, dbo.GetRasxod(BudjetID) - dbo.GetOplacheno(BudjetID) AS Kredit, dbo.GetPrixod(BudjetID)
- dbo.GetRasxod(BudjetID) AS Delta, dbo.GetPolucheno(BudjetID) - dbo.GetOplacheno(BudjetID) AS DeltaFact, Notes, HiddenNotes,
BudjetPeriodID, RespID, Number
FROM dbo.Budjets


Надо получить итоговые суммы по полям Prixod, Rashod, Polucheno, Potracheno, Kreditorka, Debitorka, Delta.


 
Anatoly Podgoretsky ©   (2003-07-02 10:35) [7]

В принципе неверно использовать OnCalcFields, поскольку вычисления производятся
1. многократно, поулчается плавающий, нарастающий итог
2. вычисления производятся не по всей таблице, а по мере необходимости



 
Zacho ©   (2003-07-02 10:41) [8]


> DBDev (02.07.03 10:24)

Все равно не понятно, как именно должен выглядеть резалтсет. Но вот простой пример запроса с агрегированием:
SELECT FIELD_1, FIELD_2, SUM(FIELD_3), SUM(FIELD_4)
FROM TABLE
GROUP BY FIELD_1,FIELD_2
В результате получишь суммы FILED_3 и FIELD_4 для тех групп строк, у которых одинаковые значения FIELD_1 и FIELD_2


 
DBDev   (2003-07-02 10:45) [9]

Дык все дело в том, что альтернативы посчитать сумму по итогам вычисляемого столбца на основе Функции никакой, в моем случае
В выражении:

Func(Поле1) AS Поле2, SUM(Func(Поле1)) As ПОЛЕ3

Получается Поле2 = ПОЛЕ3

Или я что-то делаю не так???


 
DBDev   (2003-07-02 10:47) [10]

2 Zacho:
А если FIELD_1 - это PRIMARY KEY, Тогда см сообщением выше!


 
Zacho ©   (2003-07-02 10:52) [11]


> DBDev (02.07.03 10:45)

Этого вообще не понял.

> DBDev (02.07.03 10:47)

Какие тебе нужны критерии агрегирования ? Т.е. сумму по каким записям тебе нужно посчитать ?


 
Johnmen ©   (2003-07-02 10:53) [12]

Теперь понятно, что хочешь.
Какая версия MSSQL ?


 
DBDev   (2003-07-02 10:56) [13]

2 Johnmen: 2000


 
DBDev   (2003-07-02 10:59) [14]

2 Zacho: У меня есть вьюшка (приведена выше).
Суммы надо считать по всем ее значениям. Соответственно из софта задается определенная выборка по вьюшке и каждом случае считается сумма по всем строкам результата. Фактически это сумма сумм, вычисляемых функциями из других таблиц базы.


 
Johnmen ©   (2003-07-02 11:15) [15]

Точно уже не помню (сам посмотри док-ю по диалекту SQL MSSQL2000), но вроде бы можно группировать так
GROUP BY ...,Func(Поле1),...


 
DBDev   (2003-07-02 11:28) [16]

2 JohnMen;
Нетушки, он хочет чтобы я включил все поля которые выбираю SELECT-ом в GROUP BY. В моем случае это:

ClientID, RespID, BudjetID, DateFrom, DateTo, BudjetPeriodID, Number


 
Anatoly Podgoretsky ©   (2003-07-02 11:37) [17]

DBDev (02.07.03 11:28)
Он правильно хочет, для аггрегирования должна выдаваться одна строка.


 
Johnmen ©   (2003-07-02 11:50) [18]

>DBDev (02.07.03 11:28)
>...он хочет чтобы я включил все поля которые выбираю SELECT-ом ...

А что в этом незаконного ?
Может ты не совсем понимаешь, что такое ГРУППИРОВКА ?



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

Текущий архив: 2003.07.17;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.018 c
1-55615
Sandman25
2003-07-02 17:31
2003.07.17
Переменная окружения


1-55583
Max_
2003-07-02 15:39
2003.07.17
RichEdit и загрузка отформатированного текста!


1-55521
mm0
2003-07-05 00:24
2003.07.17
Проблема с TList.


1-55503
panov
2003-07-04 15:38
2003.07.17
Object types или class?


14-55854
Alex_x
2003-07-02 10:31
2003.07.17
Как получать деньги за программы с запада