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

Вниз

Люди 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.009 c
14-55766
MBo
2003-06-28 10:40
2003.07.17
Выбрать стратегию...


4-55900
HollowMan
2003-05-13 15:42
2003.07.17
Как осуществить перерисовку и блокировку содержимого экрана?


14-55810
Дмитрий К.К.
2003-07-01 06:50
2003.07.17
Именинники 1 июля


1-55590
Бородин М
2003-07-03 11:54
2003.07.17
Открытие файла в программе


1-55494
Sfagnum
2003-07-02 14:31
2003.07.17
RichEdit выделение слова





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский