Rambler's Top100
Форум: MS ACCESSVBVBA MS OfficeMS SQL server
Новые сообщения: 0000

Форум: MS ACCESS

Вопросы связанные с MS ACCESS

Обновить визитку
Участники «Online»
Все участники

 
 

Доброго времени суток, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: как решить такую задачу?
 
 автор: eraser   (27.02.2009 в 10:19)   личное сообщение
 
 

Подскажите кто знает как решить такую задачу на ACCESS 2007
есть таблица:
магазин площадь дата
маг1 1000 01.03.2008
маг2 500 01.02.2008
маг1 900 01.05.2008
маг2 700 01.04.2008
и т.д.
Нужно получить таблицу
Магазин январь февраль март апрель май июнь и т.д.
маг1 0 0 1000 1000 900 900
маг2 0 500 500 700 700 700

Всю голову сломал
запросом точно не получается

  Ответить  
 
 автор: osmor   (27.02.2009 в 10:46)   личное сообщение
 
 


TRANSFORM Sum(Площадь) AS [s]
SELECT Магазин
FROM Таблица
GROUP BY Магазин
PIVOT Format([Дата],"mmmm") In ("январь","февраль","март","апрель","май","июнь","июль","август","сентябрь","октябрь","ноябрь","декабрь");

  Ответить  
 
 автор: Анатолий (Киев)   (27.02.2009 в 10:58)   личное сообщение
 
 

Обычный перекрестный запрос:
Магазин - заголовки строк
Month(Дата) - заголовки столбцов.
Sum(площадь) - значения
Если нужны все месяцы и в правильном порядке, то в свойстве запроса "Заголовки столбцов" указать: 1;2;3;4;5;6;7;8;9;10;11;12

Примерно так:
TRANSFORM Sum(площадь) AS [Всего]
SELECT Магазин
FROM Таблица
GROUP BY Магазин
PIVOT Month([Дата]) In (1,2,3,4,5,6,7,8,9,10,11,12);

В другом запросе/форме/отчете этим полям можно указать имена месяцев.

Если же надо имена именно в этом запросе, то вместо Month(Дата) указать:
Choose(Month(Дата);"Январь";...;"Декабрь")
а в свойстве "Заголовки столбцов" указать: "Январь";...;"Декабрь"

ЗЫ. OSMOR успел раньше , но его вариант в Украине будет возвращать Січень, Лютий... Будут проблемы с распространением БД.

  Ответить  
 
 автор: Lukas   (27.02.2009 в 11:09)   личное сообщение
 
 

Этот вариант, к сожалению, не выведет значений площадей магазинов в те месяца,
для которых нет соответствующих записей в таблице. А это автору вроде как надо?

  Ответить  
 
 автор: eraser   (27.02.2009 в 11:33)   личное сообщение
 
 

да надо именно так

  Ответить  
 
 автор: Lukas   (27.02.2009 в 11:51)   личное сообщение
 
 

Проще всего таки иметь записи для каждого магазина и каждого месяца,
включая и записи с нулевыми значениями, и использовать предложенный перекрестный запрос.
Можно иначе, используя доп. таблицу дат и функцию. Но работает медленно.
Может кто предложит более правильное решение?

  Ответить  
 
 автор: eraser   (27.02.2009 в 12:08)   личное сообщение
 
 

Если иметь записи для каждого магазина и каждого месяца то теряется смысл автоматизации то есть изменения в первой таблице происходят только после изменения площади а не каждый месяц.
а про второй вариант можно по подробнее?

  Ответить  
 
 автор: Lukas   (27.02.2009 в 12:27)   личное сообщение
9 Кб.
 
 

Может как-то так:
Требует доработки.

И все-таки, мне кажется проще один раз в конце месяца выполнить запрос на добавление нажатием кнопки, или автоматом при старте.

  Ответить  
 
 автор: osmor   (27.02.2009 в 12:44)   личное сообщение
 
 

Ну вот мы думаем почти одинаково

  Ответить  
 
 автор: Lukas   (27.02.2009 в 12:48)   личное сообщение
 
 

Ну это слишком лестно для меня.

  Ответить  
 
 автор: osmor   (27.02.2009 в 12:43)   личное сообщение
 
 

вообще предложенные запросы будут работать только пока даты в базе данных не выходят за пределы 12 месяцев... потому будут врать. т.е. преварительно нужно отбирать данные за один год.
Если создать таблицу (tblMonth) с одним полем (idMonth) и 12 строками от 1 до 12, то можно и без функции, тогда запрос будет такой

TRANSFORM Sum(s1) AS s
SELECT Магазин
                 FROM (
                        SELECT 
                                 Таблица.Магазин, 
                                First((SELECT top 1 Площадь FROM Таблица as t1  Where t1.Магазин = Таблица.Магазин
                                and month(t1.Дата) <= tblMonth.idMonth ORDER BY t1.Дата DESC)) AS s1, tblMonth.idMonth
                               FROM Таблица, tblMonth
                              GROUP BY Таблица.Магазин, tblMonth.idMonth
                     )  as t2
GROUP BY Магазин
PIVOT Format(dateserial(2008,t2.idmonth,1),"mmmm") In ("январь","февраль","март","апрель","май","июнь","июль","август","сентябрь","октябрь","ноябрь","декабрь");


Но естественно при предварительном отборе данных за один год

  Ответить  
 
 автор: osmor   (27.02.2009 в 12:51)   личное сообщение
14 Кб.
 
 

Это пример

  Ответить  
 
 автор: eraser   (27.02.2009 в 13:19)   личное сообщение
 
 

БОЛЬШОЕ ВСЕМ СПАСИБО!!!!
ушел с головой в изучение

  Ответить  
HiProg.com - Технологии программирования
Rambler's Top100 TopList