Форум: "Потрепаться";
Текущий архив: 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.008 c