Есть таблица с тарифами их изменениями по датам. Сегодня поменялся один тариф, завтра (в следующем месяце) другой. Тарифы то увеличиваются, то уменьшаются.
Собственно сама тестовая таблица выглядит так:
ОбъектТарификации | ДатаТарифа | Тариф | Объект 1 | 01.01.2014 | 100 | Объект 2 | 01.01.2014 | 100 | Объект 3 | 01.01.2014 | 100 | Объект 4 | 01.01.2014 | 100 | Объект 5 | 01.01.2014 | 100 | Объект 6 | 01.02.2014 | 200 | Объект 1 | 01.02.2014 | 200 | Объект 7 | 01.02.2014 | 200 | Объект 2 | 01.03.2014 | 300 | Объект 6 | 01.03.2014 | 300 | Объект 7 | 01.03.2014 | 300 | Объект 1 | 01.04.2014 | 150 | Объект 5 | 01.04.2014 | 150 | Объект 7 | 01.04.2014 | 150 |
|
Должна получиться таблица следующего вида (Объект, последний тариф (в дальнейшем с ограничением по дате), последняя дата изменения тарифа и для визуального контроля тарифы по датам):
ОбъектТарификации | ТекущийТариф | ДатаПослИзмТарифа | 01_04_2014 | 01_03_2014 | 01_02_2014 | 01_01_2014 | Объект 1 | 150 | 01/04/2014 | 150 | ___ | 200 | 100 | Объект 2 | 300 | 01/03/2014 | ___ | 300 | ___ | 100 | Объект 3 | 100 | 01/01/2014 | ___ | ___ | ___ | 100 | Объект 4 | 100 | 01/01/2014 | ___ | ___ | ___ | 100 | Объект 5 | 150 | 01/04/2014 | 150 | ___ | ___ | 100 | Объект 6 | 300 | 01/03/2014 | ___ | 300 | 200 | ___ | Объект 7 | 150 | 01/04/2014 | 150 | 300 | 200 | ___ |
|
Но после запроса с PIVOT получается какая-то ерунда:
ОбъектТарификации | ТекущийТариф | ДатаПослИзмТарифа | 01_04_2014 | 01_03_2014 | 01_02_2014 | 01_01_2014 | Объект 1 | 200 | 01/04/2014 | 150 | | 200 | 100 | Объект 2 | 300 | 01/03/2014 | | 300 | | 100 | Объект 3 | 100 | 01/01/2014 | | | | 100 | Объект 4 | 100 | 01/01/2014 | | | | 100 | Объект 5 | 150 | 01/04/2014 | 150 | | | 100 | Объект 6 | 300 | 01/03/2014 | | 300 | 200 | | Объект 7 | 300 | 01/04/2014 | 150 | 300 | 200 | |
|
TRANSFORM Last(Т.[Тариф]) AS [Last-Тариф]
SELECT
Т.[ОбъектТарификации],
Last(Т.[Тариф]) AS [Текущий Тариф],
First(Т.[ДатаТарифа]) AS ДатаПослИзмТариф
FROM (
SELECT Тарифы.[ОбъектТарификации],
Тарифы.[Тариф],
Тарифы.[ДатаТарифа]
FROM Тарифы
ORDER BY Тарифы.[ОбъектТарификации], Тарифы.[ДатаТарифа] DESC
) AS Т
GROUP BY Т.[ОбъектТарификации]
ORDER BY Т.[ОбъектТарификации], Т.[ДатаТарифа] DESC
PIVOT Т.[ДатаТарифа];
Пробовал и Last и First - результат всё одно какой-то левый получается. Должен выдавать первое, либо последнее значение, а выдаёт когда как. То среднее - по таблице видно. Даже внутренний запрос с сортировкой сделал. Сам запрос формируется нормально, а при вставке внутрь запроса с PIVOT - опять такая-же чехарда. (Last-First в перврй части Select-а выставлял и одинаковые и разные - Дата вроде выбирается правильно, но тоже под вопросом - может случайно). Непонятно при аггрегированных функциях First и Last появление средних значений, которые и не First и не Last.
Может где что не так разворачиваю?
Подскажите, гуру, где копать.
Индекса по Объекту тарификации и дате не делал. Сортировку, как и группировку указываю явно. Да и запрос этот тестовый, реальный будет отличаться.
Пока делаю на MSAccess в дальнейшем запрос будет крутиться на MSSQL2005, а приложение так-же на Access.
http://www.sql.ru/forum/1080949/pivot-sortirovka-i-vybor-poslednego-znacheniya