Как развернуть таблицу на 52 недели, преодолев лимит 256 таблиц в query

Alexander2
Дата: 23.01.2013 04:02:27
Пытаюсь развернуть рабочие периоды и итоги в кросс-таблицу.
Периодов 52 - то есть 52 рабочие недели по 5 дней

Столкнулся с лимитом 256 таблиц. - Получается развернуть только 35 недель.

Скрипт выкладываю в зипе - нет смысла тут пейстить. Все что выше 35 недель закомменчено.
Бекап базы тоже в атачменте.
База примитивная - там всего две таблицы. MyPeriods и MyProduction_Planning
Alexander2
Дата: 23.01.2013 04:03:01
Alexander2,

второй кусок архива
Alexander2
Дата: 23.01.2013 04:03:43
Alexander2,

третий кусок
Alexander2
Дата: 23.01.2013 04:04:23
Alexander2,

сам запрос
aleks2
Дата: 23.01.2013 07:44:28
Открой, что-ле, для себя временные таблицы?
Алексей Куренков
Дата: 23.01.2013 08:53:47
aleks2,

у Вас в запросе я так понимаю одна таблица используется 52 раза для вычисления сумм в 52х диапазонах?
Здесь оптимально использовать приложение селекта - PIVOT. Посмотрите документацию и примеры - Ваш случай. Не считал сколько колонок у Вас должно выводиться, насколько я помню есть ограничение вроде в 1024 колонки - максимальный размер rowset.
Alexander2
Дата: 23.01.2013 09:08:19
Алексей Куренков,

Нет не так.
...
SELECT
	 PART_ID
	,ORDER_IBT_ID
	,[w1|T] = case when a.seq_week = (select seq_week from MyPERIODS where date < getdate() and getdate() < (date + 1)) and a.DayOfWeek = 'Tot' then PLANNED else 0 end
	,[w1|SS] = case when a.seq_week = (select seq_week from MyPERIODS where date < getdate() and getdate() < (date + 1)) and a.DayOfWeek = 'WKN' then PLANNED else 0 end
	,[w1|Mon] = case when a.seq_week = (select seq_week from MyPERIODS where date < getdate() and getdate() < (date + 1)) and a.DayOfWeek = 'Mon' then PLANNED else 0 end
	,[w1|Tue] = case when a.seq_week = (select seq_week from MyPERIODS where date < getdate() and getdate() < (date + 1)) and a.DayOfWeek = 'Tue' then PLANNED else 0 end
	,[w1|Wed] = case when a.seq_week = (select seq_week from MyPERIODS where date < getdate() and getdate() < (date + 1)) and a.DayOfWeek = 'Wed' then PLANNED else 0 end
	,[w1|Thu] = case when a.seq_week = (select seq_week from MyPERIODS where date < getdate() and getdate() < (date + 1)) and a.DayOfWeek = 'Thu' then PLANNED else 0 end
	,[w1|Fri] = case when a.seq_week = (select seq_week from MyPERIODS where date < getdate() and getdate() < (date + 1)) and a.DayOfWeek = 'Fri' then PLANNED else 0 end
	,[w2|T] = case when a.seq_week = (select seq_week + 1 from MyPERIODS where date < getdate() and getdate() < (date + 1)) and a.DayOfWeek = 'Tot' then PLANNED else 0 end
	,[w2|SS] = case when a.seq_week = (select seq_week + 1 from MyPERIODS where date < getdate() and getdate() < (date + 1)) and a.DayOfWeek = 'WKN' then PLANNED else 0 end
	,[w2|Mon] = case when a.seq_week = (select seq_week + 1 from MyPERIODS where date < getdate() and getdate() < (date + 1)) and a.DayOfWeek = 'Mon' then PLANNED else 0 end
	,[w2|Tue] = case when a.seq_week = (select seq_week + 1 from MyPERIODS where date < getdate() and getdate() < (date + 1)) and a.DayOfWeek = 'Tue' then PLANNED else 0 end
	,[w2|Wed] = case when a.seq_week = (select seq_week + 1 from MyPERIODS where date < getdate() and getdate() < (date + 1)) and a.DayOfWeek = 'Wed' then PLANNED else 0 end
	,[w2|Thu] = case when a.seq_week = (select seq_week + 1 from MyPERIODS where date < getdate() and getdate() < (date + 1)) and a.DayOfWeek = 'Thu' then PLANNED else 0 end
	,[w2|Fri] = case when a.seq_week = (select seq_week + 1 from MyPERIODS where date < getdate() and getdate() < (date + 1)) and a.DayOfWeek = 'Fri' then PLANNED else 0 end
,...
--вплоть до w52
from ( blah-blah) a


Работает с 35 неделями по 7 дней (245 колонок + 2 первые)
Если 36 - то падает с ошибкой про 256 таблиц.
Я не представляю как эти условия вписать с PIVOT.
aleks2
Дата: 23.01.2013 09:09:09
Алексей Куренков
aleks2,

у Вас в запросе

У мя, уважаемый, проблем нету.
aleks2
Дата: 23.01.2013 09:12:04
Alexander2

Нет не так.

Работает с 35 неделями по 7 дней (245 колонок + 2 первые)
Если 36 - то падает с ошибкой про 256 таблиц.
Я не представляю как эти условия вписать с PIVOT.


Страдалец, создай временную таблицу НУЖНОЙ ширшины.
И заполни ее в ДВА запроса по 26 недель за раз.
Alexander2
Дата: 23.01.2013 20:34:49
пришла мысль - генерить второй кусок для остатков и left join c предыдущим