|
|
|
| Подскажите кто знает как решить такую задачу на 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
Всю голову сломал
запросом точно не получается | |
|
| |
|
|
|
|
TRANSFORM Sum(Площадь) AS [s]
SELECT Магазин
FROM Таблица
GROUP BY Магазин
PIVOT Format([Дата],"mmmm") In ("январь","февраль","март","апрель","май","июнь","июль","август","сентябрь","октябрь","ноябрь","декабрь");
|
| |
|
| |
|
|
|
| Обычный перекрестный запрос:
Магазин - заголовки строк
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 успел раньше , но его вариант в Украине будет возвращать Січень, Лютий... Будут проблемы с распространением БД. | |
|
| |
|
|
|
| Этот вариант, к сожалению, не выведет значений площадей магазинов в те месяца,
для которых нет соответствующих записей в таблице. А это автору вроде как надо?
| |
|
| |
|
|
|
|
| Проще всего таки иметь записи для каждого магазина и каждого месяца,
включая и записи с нулевыми значениями, и использовать предложенный перекрестный запрос.
Можно иначе, используя доп. таблицу дат и функцию. Но работает медленно.
Может кто предложит более правильное решение? | |
|
| |
|
|
|
| Если иметь записи для каждого магазина и каждого месяца то теряется смысл автоматизации то есть изменения в первой таблице происходят только после изменения площади а не каждый месяц.
а про второй вариант можно по подробнее? | |
|
| |
|
9 Кб. |
|
| Может как-то так:
Требует доработки.
И все-таки, мне кажется проще один раз в конце месяца выполнить запрос на добавление нажатием кнопки, или автоматом при старте. | |
|
| |
|
|
|
|
| Ну это слишком лестно для меня. | |
|
| |
|
|
|
| вообще предложенные запросы будут работать только пока даты в базе данных не выходят за пределы 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 ("январь","февраль","март","апрель","май","июнь","июль","август","сентябрь","октябрь","ноябрь","декабрь");
|
Но естественно при предварительном отборе данных за один год | |
|
| |
|
14 Кб. |
|
| Это пример | |
|
| |
|
|
|
| БОЛЬШОЕ ВСЕМ СПАСИБО!!!!
ушел с головой в изучение | |
|
| |