Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2 3 4   вперед  Ctrl      все
 Как развернуть таблицу на 52 недели, преодолев лимит 256 таблиц в query  [new]
Alexander2
Member

Откуда: Calgary
Сообщений: 1167
Пытаюсь развернуть рабочие периоды и итоги в кросс-таблицу.
Периодов 52 - то есть 52 рабочие недели по 5 дней

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

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

К сообщению приложен файл (Experimental.part01.rar - 146Kb) cкачать
23 янв 13, 04:02    [13812951]     Ответить | Цитировать Сообщить модератору
 Re: Как развернуть таблицу на 52 недели, преодолев лимит 256 таблиц в query  [new]
Alexander2
Member

Откуда: Calgary
Сообщений: 1167
Alexander2,

второй кусок архива

К сообщению приложен файл (Experimental.part02.rar - 146Kb) cкачать
23 янв 13, 04:03    [13812952]     Ответить | Цитировать Сообщить модератору
 Re: Как развернуть таблицу на 52 недели, преодолев лимит 256 таблиц в query  [new]
Alexander2
Member

Откуда: Calgary
Сообщений: 1167
Alexander2,

третий кусок

К сообщению приложен файл (Experimental.part03.rar - 47Kb) cкачать
23 янв 13, 04:03    [13812953]     Ответить | Цитировать Сообщить модератору
 Re: Как развернуть таблицу на 52 недели, преодолев лимит 256 таблиц в query  [new]
Alexander2
Member

Откуда: Calgary
Сообщений: 1167
Alexander2,

сам запрос

К сообщению приложен файл (MyPERIODS.rar - 3Kb) cкачать
23 янв 13, 04:04    [13812955]     Ответить | Цитировать Сообщить модератору
 Re: Как развернуть таблицу на 52 недели, преодолев лимит 256 таблиц в query  [new]
aleks2
Guest
Открой, что-ле, для себя временные таблицы?
23 янв 13, 07:44    [13813022]     Ответить | Цитировать Сообщить модератору
 Re: Как развернуть таблицу на 52 недели, преодолев лимит 256 таблиц в query  [new]
Алексей Куренков
Member [заблокирован]

Откуда: Москва
Сообщений: 567
aleks2,

у Вас в запросе я так понимаю одна таблица используется 52 раза для вычисления сумм в 52х диапазонах?
Здесь оптимально использовать приложение селекта - PIVOT. Посмотрите документацию и примеры - Ваш случай. Не считал сколько колонок у Вас должно выводиться, насколько я помню есть ограничение вроде в 1024 колонки - максимальный размер rowset.
23 янв 13, 08:53    [13813182]     Ответить | Цитировать Сообщить модератору
 Re: Как развернуть таблицу на 52 недели, преодолев лимит 256 таблиц в query  [new]
Alexander2
Member

Откуда: Calgary
Сообщений: 1167
Алексей Куренков,

Нет не так.
...
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.
23 янв 13, 09:08    [13813229]     Ответить | Цитировать Сообщить модератору
 Re: Как развернуть таблицу на 52 недели, преодолев лимит 256 таблиц в query  [new]
aleks2
Guest
Алексей Куренков
aleks2,

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

У мя, уважаемый, проблем нету.
23 янв 13, 09:09    [13813234]     Ответить | Цитировать Сообщить модератору
 Re: Как развернуть таблицу на 52 недели, преодолев лимит 256 таблиц в query  [new]
aleks2
Guest
Alexander2

Нет не так.

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


Страдалец, создай временную таблицу НУЖНОЙ ширшины.
И заполни ее в ДВА запроса по 26 недель за раз.
23 янв 13, 09:12    [13813253]     Ответить | Цитировать Сообщить модератору
 Re: Как развернуть таблицу на 52 недели, преодолев лимит 256 таблиц в query  [new]
Alexander2
Member

Откуда: Calgary
Сообщений: 1167
пришла мысль - генерить второй кусок для остатков и left join c предыдущим
23 янв 13, 20:34    [13818063]     Ответить | Цитировать Сообщить модератору
 Re: Как развернуть таблицу на 52 недели, преодолев лимит 256 таблиц в query  [new]
Glory
Member

Откуда:
Сообщений: 104751
Alexander2
пришла мысль - генерить второй кусок для остатков и left join c предыдущим

лучше подумать над тем, зачем в каждом case по запросу
23 янв 13, 20:42    [13818112]     Ответить | Цитировать Сообщить модератору
 Re: Как развернуть таблицу на 52 недели, преодолев лимит 256 таблиц в query  [new]
Crimean
Member

Откуда:
Сообщений: 13147
Алексей Куренков
Здесь оптимально использовать приложение селекта - PIVOT


+1
23 янв 13, 21:02    [13818179]     Ответить | Цитировать Сообщить модератору
 Re: Как развернуть таблицу на 52 недели, преодолев лимит 256 таблиц в query  [new]
Ennor Tiegael
Member

Откуда:
Сообщений: 3422
Alexander2
пришла мысль - генерить второй кусок для остатков и left join c предыдущим
Жаль, что не пришли "транспонировать на клиенте" или "открыть для себя matrix report".

Вам прям внутри сиквела эта выборка нужна? Реально интересно, зачем...
23 янв 13, 22:22    [13818346]     Ответить | Цитировать Сообщить модератору
 Re: Как развернуть таблицу на 52 недели, преодолев лимит 256 таблиц в query  [new]
Alexander2
Member

Откуда: Calgary
Сообщений: 1167
Ennor Tiegael
Вам прям внутри сиквела эта выборка нужна? Реально интересно, зачем...

Нужна для показа на клиенте следующей (редактируемой) таблицы

К сообщению приложен файл. Размер - 42Kb
23 янв 13, 22:37    [13818399]     Ответить | Цитировать Сообщить модератору
 Re: Как развернуть таблицу на 52 недели, преодолев лимит 256 таблиц в query  [new]
Ennor Tiegael
Member

Откуда:
Сообщений: 3422
Alexander2,

По моему опыту, такое лучше разворачивать на клиенте. Да, биндинг мышкой нарисовать не получится, скорее всего. Зато работать будет гораздо быстрее, и код будет понятнее - проще сопровождать. Ну и не упретесь в лимит на 1024 столбца в запросе, если потом кто-нибудь из начальства захочет реально долгосрочного планирования.
23 янв 13, 22:51    [13818442]     Ответить | Цитировать Сообщить модератору
 Re: Как развернуть таблицу на 52 недели, преодолев лимит 256 таблиц в query  [new]
Alexander2
Member

Откуда: Calgary
Сообщений: 1167
Crimean,

Можно хоть бы краем глазка посмотреть на РЕАЛЬНОЕ применение PIVOT для моего случая?
Хотя бы для 3 колонок.
24 янв 13, 03:00    [13819037]     Ответить | Цитировать Сообщить модератору
 Re: Как развернуть таблицу на 52 недели, преодолев лимит 256 таблиц в query  [new]
Alexander2
Member

Откуда: Calgary
Сообщений: 1167
aleks2,
и как эти временные таблицы выглядят то?
24 янв 13, 03:02    [13819040]     Ответить | Цитировать Сообщить модератору
 Re: Как развернуть таблицу на 52 недели, преодолев лимит 256 таблиц в query  [new]
Ruuu
Member

Откуда: Иркутск
Сообщений: 4272
Alexander2,
Посмотрите здесь Script to create dynamic PIVOT queries in SQL Server, может поможет.
24 янв 13, 05:24    [13819088]     Ответить | Цитировать Сообщить модератору
 Re: Как развернуть таблицу на 52 недели, преодолев лимит 256 таблиц в query  [new]
aleks2
Guest
Alexander2
aleks2,
и как эти временные таблицы выглядят то?

Приблизительно так
CREATE TABLE #MyFirstTemporalTable (Field1 as int, ...)


или так

 declare @MyFirstTemporalTable table(Field1 as int, ...)
24 янв 13, 06:38    [13819125]     Ответить | Цитировать Сообщить модератору
 Re: Как развернуть таблицу на 52 недели, преодолев лимит 256 таблиц в query  [new]
Alexander2
Member

Откуда: Calgary
Сообщений: 1167
Ruuu,

спасибо, я посмотрел. Это очень простые примеры, ессно, я применяю что-то похожее, когда ситуация простая.
Однако у меня чуть-чуть другой случай.
24 янв 13, 06:44    [13819134]     Ответить | Цитировать Сообщить модератору
 Re: Как развернуть таблицу на 52 недели, преодолев лимит 256 таблиц в query  [new]
Alexander2
Member

Откуда: Calgary
Сообщений: 1167
aleks2
Приблизительно так...

ну нельзя же так плохо думать о других ;) !
Я прекрасно знаю что такое временная таблица.
24 янв 13, 06:47    [13819136]     Ответить | Цитировать Сообщить модератору
 Re: Как развернуть таблицу на 52 недели, преодолев лимит 256 таблиц в query  [new]
aleks2
Guest
Alexander2
aleks2
Приблизительно так...

ну нельзя же так плохо думать о других ;) !
Я прекрасно знаю что такое временная таблица.

Тогда чего ты вопрошаешь глупости?
24 янв 13, 06:50    [13819141]     Ответить | Цитировать Сообщить модератору
 Re: Как развернуть таблицу на 52 недели, преодолев лимит 256 таблиц в query  [new]
Alexander2
Member

Откуда: Calgary
Сообщений: 1167
Кому интересно, разрулил так:
1) Сначала попробовал первый кусок c Cas-ами .... представить в виде View из 247 колонок, второй - в виде View (остатки 121 колонка). Не тут то было, при связывании двух View все равно прорюхала про лимит 256 таблиц, однако ругнулась про переполнение стека.
Хрен с тобой, золотая рыбка!
Другой вариант (да, умная мысль пришла апосля поста alex2 про 26, только я сделал по 35 и 17):
2) Записываю/инсерчу первый кусок в временную таблицу #My35, второй (остатки с 17 по 52) - в #My52.
Select distinct a.Part_Id,a.Order_Id,a.[W1|T],....b.[W36|T],....b.[W52|Fri] from #My35 A left join #My52 B on A.Part_Id=B.Part_Id and A.Order_ID=B.Order_Id

....А умные фразы про применение Pivot прошу подтверждать конструктивными примерами на реальных данных из приведенного бекапа, иначе посты выглядят как музыкальные пуки в бочку.
24 янв 13, 07:00    [13819148]     Ответить | Цитировать Сообщить модератору
 Re: Как развернуть таблицу на 52 недели, преодолев лимит 256 таблиц в query  [new]
aleks2
Guest
Alexander2
Другой вариант (да, умная мысль пришла апосля поста alex2 про 26, только я сделал по 35 и 17):
2) Записываю/инсерчу первый кусок в временную таблицу #My35, второй (остатки с 17 по 52) - в #My52.


Вот дуракам советовать - все одно что плевать против ветра.

Ну сделай ты последнее мозговое усилие - осознай что времянка может содержать ВСЕ. Заодно она (таблица) будет РЕДАКТИРУЕМА в гриде без усилий.
24 янв 13, 10:09    [13819747]     Ответить | Цитировать Сообщить модератору
 Re: Как развернуть таблицу на 52 недели, преодолев лимит 256 таблиц в query  [new]
Alexander2
Member

Откуда: Calgary
Сообщений: 1167
aleks2,
а с дураком спорить это что тогда?

прошу же нормально - покажи если не дурак это в скрипте "засунь в ТВОЮ временную таблицу все 52 колонки"
24 янв 13, 11:23    [13820219]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3 4   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить