Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Интересная сумма / 20 сообщений из 20, страница 1 из 1
28.08.2003, 13:26
    #32250021
Dnico
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интересная сумма
Есть такая задачка :

TABLE1 (ID,YEAR,QTY1,..., QTY12)
Требуется получить сумму по QTYx за последние 6 месяцев. Из таблицы понятно, что каждая запись содержит год и кол-ва по месяцам.
Какие могут быть предложения?
...
Рейтинг: 0 / 0
28.08.2003, 13:33
    #32250031
Zmeishe
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интересная сумма
Почему именно такая структура таблицы?

Почему не так:
TABLE1(ID, Q_DATE, QTM);
где Q_DATE это 01.01.2003, 01.02.2003 ... 01.12.2003
...
Рейтинг: 0 / 0
28.08.2003, 13:47
    #32250053
Dnico
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интересная сумма
Потому что данные выводятся в 1 строчку в 12 колонок
...
Рейтинг: 0 / 0
28.08.2003, 13:51
    #32250055
Павел Воронцов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интересная сумма
Код: plaintext
1.
2.
3.
SELECT SUM(QTY7+QTY8+QTY9+QTY10+QTY11+QTY12)
FROM TABLE1
WHERE YEAR = :YEAR

??

Но лучше сделайте redesign, как Zmeishe посоветовал. Хранение и представление данных - две разные задачи, не путайте их.
...
Рейтинг: 0 / 0
28.08.2003, 13:51
    #32250056
Евгений, Екатеринбург
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интересная сумма
Все-таки мне кажется надо делать так как сказал Змеище, ну а через хп вводить выводить данные как душе заблагорассудится... Все-таки ввод данных и их хранение разные вещи..
...
Рейтинг: 0 / 0
28.08.2003, 13:53
    #32250058
Dnico
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интересная сумма
Да, но только вот не надо забывать о скорости выполнения запросов ...
...
Рейтинг: 0 / 0
28.08.2003, 13:59
    #32250066
Zmeishe
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интересная сумма
Dnico
Что касается скорости.

Например сейчас Март. Вытащить сумму за последние 6 месяцев это:
1. Найти этот год и из этой строки вытащить JAN, FEB
2. Найти предыдущий год и из той строки вытащить DEC, NOV, OCT, SEP.
3. Склеить 1 и 2.

"Скоко вешать в граммах???"
...
Рейтинг: 0 / 0
28.08.2003, 14:03
    #32250073
Dnico
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интересная сумма
Дело еще и в том, что таких вот QTYx - не 12, а 4 по 12, и как вы посоветуете делать SELECT ?

Код: plaintext
1.
2.
3.
4.
SELECT t1.QTY1, .... , tx.QTYx FROM ...
JOIN t1
...
JOIN tx
...
Рейтинг: 0 / 0
28.08.2003, 14:08
    #32250087
Dnico
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интересная сумма
Zmeishe , это я уже по поводу изменения структуры ...
...
Рейтинг: 0 / 0
28.08.2003, 14:09
    #32250092
Zmeishe
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интересная сумма
В таком случае сформулируй задачу, которую ты решаешь.
Сначала практика затем мат. модель!
...
Рейтинг: 0 / 0
28.08.2003, 14:18
    #32250110
Zmeishe
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интересная сумма
Код: plaintext
1.
2.
3.
4.
5.
TABLE1(ID, NUM_GROUP, M_DATE, QT_MONTH)

SELECT NUM_GROUP, SUM(QT_MONTH)
FROM TABLE1
WHERE M_DATE between :ST_MONTH and :EN_MONTH
GROUP BY NUM_GROUP
...
Рейтинг: 0 / 0
28.08.2003, 14:20
    #32250112
Dnico
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интересная сумма
OK!

Структура данных выше ...
Вопрос в том, как удобнее получать сумму по такой вот таблице. Я выбираю текущую запись и беру 6 соответствующих цифорок, но вот когда это делается в начале года, то естественно приходится брать предыдущий год и там добирать остатки. Все это происходит в ХП в FB 1.5.
Проблема в том, что получается жуткий код с использованием кучи IF.

Так вот может есть какое другое решение?
...
Рейтинг: 0 / 0
28.08.2003, 14:29
    #32250127
Zmeishe
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интересная сумма
Другое решение - наращивать в таблице строки, а не столбцы.
Добавить минимально-необходимое количество столбцов признаков(сигнальных флагов) и изпользовать это в WHERE.
...
Рейтинг: 0 / 0
28.08.2003, 14:37
    #32250142
Dnico
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интересная сумма
Тогда как решить такую вот ситуацию:
Все выводится в DBCONTRLGRID
Код: plaintext
1.
2.
3.
4.
5.
                  Название	Январь	….......	Декабрь	Итого
Получено					
На складе					
Отгружено					
Брак					
[src][/src]
...
Рейтинг: 0 / 0
28.08.2003, 14:50
    #32250158
Zmeishe
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интересная сумма
Можно в лоб.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
TABLE1(ID, NUM_GROUP, M_DATE, QT_MONTH)
NUM_GROUP -  1  // Получено
NUM_GROUP -  2  // Отгружено
NUM_GROUP -  3  // На складе
NUM_GROUP -  4  // Брак

SELECT NUM_GROUP, M_DATE, SUM(QT_MONTH)
FROM TABLE1
WHERE M_DATE between :ST_MONTH and :EN_MONTH
GROUP BY NUM_GROUP, M_DATE

Результат закинь в F1Book с панели ActiveX. Прекрасный компонент, прекрасный Hepl, прекрасно работает.
...
Рейтинг: 0 / 0
28.08.2003, 14:51
    #32250160
Diehard
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интересная сумма
Напиши маленкую процедуру
...
Рейтинг: 0 / 0
28.08.2003, 14:55
    #32250163
Павел Воронцов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интересная сумма
2 Dnico

Используется SQL-92
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
CREATE TABLE CUPBOARD (
      DT DATE NOT NULL CHECK (DAY(DT) =  1 ),  -- только 1ое число месяца
 
      ACTION INT NOT NULL,  -- отгружено, получено и пр.
 
      QTY INT NOT NULL CHECK (QTY >  0 ),
      CONSTRAINT CPB_PK PRIMARY KEY (DT, ACTION)
);

 -- получить сумму за последние 6 месяцев
 

SELECT ACTION, SUM(QTY)
FROM CUPBOARD
WHERE DATE() - DT <= INTERVAL  6  MONTH;

 -- получить отчёт
 

SELECT ACTION,
       SUM(CASE MONTH(DT) WHEN  1  THEN QTY ELSE  0  END) AS Jan,
      ....
       SUM(CASE MONTH(DT) WHEN  12  THEN QTY ELSE  0  END) AS Dec
FROM CUPBOARD
GROUP BY ACTION
ORDER BY ACTION;
...
Рейтинг: 0 / 0
28.08.2003, 14:57
    #32250165
Павел Воронцов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интересная сумма
Код: plaintext
1.
2.
3.
....
WHERE YEAR(DT) = :YEAR
GROUP BY ...


Sorry )
...
Рейтинг: 0 / 0
28.08.2003, 14:57
    #32250166
Zmeishe
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интересная сумма
Dnico
Тебя наверное смутит отсутствие Итого, в приведённом мной коде.
F1Book - он как Excel в нужной ячейке укажешь прямо программно
F1Book->FormulaRC[Row][Col] = "SUM(C3:N3)"; Он сам всё пересчитает, как только его заполнишь.
...
Рейтинг: 0 / 0
28.08.2003, 15:01
    #32250174
Dnico
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интересная сумма
Zmeishe

Хорошо, посмотрим ... Спасибо !
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Интересная сумма / 20 сообщений из 20, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]