Разница между мной и сумасшедшим в том, что я не сумасшедший.(с)
Добрый вечер.
Я к вам не с пустыми руками, а с тупым вопросом.
Имеется: delphi7, quickreport5 и простой select-запрос, в котором выбираются некоторые данные, сгруппированные по дате. Дата идет в формате dd.mm.yyyy. А теперь, внимание, вопрос: как сделать в отчете группировку по месяцам? То есть чтобы выводились данные не за конкретное число месяца, а за весь месяц в сумме?
Понимаю, что вопрос нубский, но надеюсь, поможете.
Я к вам не с пустыми руками, а с тупым вопросом.

Имеется: delphi7, quickreport5 и простой select-запрос, в котором выбираются некоторые данные, сгруппированные по дате. Дата идет в формате dd.mm.yyyy. А теперь, внимание, вопрос: как сделать в отчете группировку по месяцам? То есть чтобы выводились данные не за конкретное число месяца, а за весь месяц в сумме?
Понимаю, что вопрос нубский, но надеюсь, поможете.

А вобще - SELECT (что-то1, что-то2, что-то3) FROM таблица GROUP BY ВЗЯТЬ_МЕСЯЦ(имя_колонки_с_датой)
Вместо что-тоX - группируемая колонка или результат аггрегатной функции
ВЗЯТЬ_МЕСЯЦ - функция, которая из даты возвращает угадайте-что
И причём тут формат даты? Они что, в строковом виде хранятся?
Выложи сюда свой запрос без группировки, а то объяснять на абстрактных понятиях в данном случае это лишнее.
Тебе в принципе нужно просто даты округлить до MM.YYYY и по этому группировать.
База из двух таблиц. В одной - список фирм, в другой - курсы акций по дням.
СУБД вроде Paradox.
Нет, даты не в строковом формате, естественно, это так, на всякий случай.=)
запрос самый простой, что-то вроде:
SELECT Kurs.Date, Firm.Name, Kurs.Kurs_pokupki, Kurs.Kurs_Prodazhi
FROM Kurs, Firm
GROUP BY ...
ORDER BY Kurs.Date
нужно просто даты округлить до MM.YYYY и по этому группировать
а это как?)
Попробуй GROUP BY TRUNC(Kurs.Date, 'МONTH')
Просто не помню действуют ли функции в group by, если нет, то напиши с подзапросом.
нет, это не действует
а по поводу подзапроса я уже и не знаю, что сообразить(
SELECT DATEPART(month, Kurs.Date), DATEPART(year, Kurs.Date), Firm.Name, AVG(Kurs.Kurs_pokupki), AVG(Kurs.Kurs_Prodazhi)
FROM Kurs, Firm
GROUP BY Firm.Name, DATEPART(year, Kurs.Date), DATEPART(month, Kurs.Date)
ORDER BY DATEPART(year, Kurs.Date), DATEPART(month, Kurs.Date)
Это верно по крайней мере для MS SQL. Если нужно выбирать и по дням, и с группировкой по месяцам (в одном запросе), то можно завести что-то типа этого:
SELECT DATEPART(month, Kurs.Date), DATEPART(year, Kurs.Date), Kurs.Date, Firm.Name, Kurs.Kurs_pokupki, Kurs.Kurs_Prodazhi
FROM Kurs, Firm
UNION ALL
SELECT DATEPART(month, Kurs.Date), DATEPART(year, Kurs.Date), NULL, Firm.Name, AVG(Kurs.Kurs_pokupki), AVG(Kurs.Kurs_Prodazhi)
FROM Kurs, Firm
GROUP BY Firm.Name, DATEPART(year, Kurs.Date), DATEPART(month, Kurs.Date)
ORDER BY DATEPART(year, Kurs.Date), DATEPART(month, Kurs.Date)
Опять же, это верно для MSSQL.
Если дата хранится в формате varchar (что, на мой взгляд, неразумно в том числе с точки зрения сортировки), то DATEPART заменяется на SUBSTRING для соответствующей части строки.
Кстати, у тебя Krus и Firm как связаны? Судя по запросу, ты делаешь CROSS JOIN. А зачем?
Доки по своей в руки и вперёд