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

Alexander2
Дата: 24.01.2013 06:47:25
aleks2
Приблизительно так...

ну нельзя же так плохо думать о других ;) !
Я прекрасно знаю что такое временная таблица.
aleks2
Дата: 24.01.2013 06:50:49
Alexander2
aleks2
Приблизительно так...

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

Тогда чего ты вопрошаешь глупости?
Alexander2
Дата: 24.01.2013 07:00:21
Кому интересно, разрулил так:
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 прошу подтверждать конструктивными примерами на реальных данных из приведенного бекапа, иначе посты выглядят как музыкальные пуки в бочку.
aleks2
Дата: 24.01.2013 10:09:34
Alexander2
Другой вариант (да, умная мысль пришла апосля поста alex2 про 26, только я сделал по 35 и 17):
2) Записываю/инсерчу первый кусок в временную таблицу #My35, второй (остатки с 17 по 52) - в #My52.


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

Ну сделай ты последнее мозговое усилие - осознай что времянка может содержать ВСЕ. Заодно она (таблица) будет РЕДАКТИРУЕМА в гриде без усилий.
Alexander2
Дата: 24.01.2013 11:23:05
aleks2,
а с дураком спорить это что тогда?

прошу же нормально - покажи если не дурак это в скрипте "засунь в ТВОЮ временную таблицу все 52 колонки"
Алексей Куренков
Дата: 24.01.2013 11:51:17
Alexander2,

Alexander2
....А умные фразы про применение Pivot прошу подтверждать конструктивными примерами на реальных данных из приведенного бекапа, иначе посты выглядят как музыкальные пуки в бочку.


Я разворачивал Ваш бэкап... посмотрел 2 таблицы и запрос. У меня нет понимания полного какая задача и что конкретно нужно. Что бы это понять нужно что бы Вы объяснили, после это реализовать - на это может уйти полдня и больше. Т.е. по сути это почти весь рабочий день за Вас. Все таки я понимаю так что свою работу должны делать Вы сами. А не ждать когда ее другие за Вас сделают в порядке меценатства.
Высылаю для примера один из последних скриптов своих где используется PIVOT в нем и таблицы создаются и БД. Можете посмотреть как можно использовать в этом примере - в любом случае если есть потребность время и желание Вам это и реализовывать.
aleks2
Дата: 24.01.2013 12:02:42
Alexander2
aleks2,
а с дураком спорить это что тогда?

прошу же нормально - покажи если не дурак это в скрипте "засунь в ТВОЮ временную таблицу все 52 колонки"

Специальное издание

create table #T(
     PART_ID int primary key clustered
	,ORDER_IBT_ID int
	,[w1|T] ...
	,[w1|SS]
	,[w1|Mon]
	,[w1|Tue]
	,[w1|Wed]
	,[w1|Thu] 
	,[w1|Fri]
	,[w2|T]
	,[w2|SS]
	,[w2|Mon]
	,[w2|Tue]
	,[w2|Wed]
	,[w2|Thu]
	,[w2|Fri]
    , -- фсе поля, которые те нужны
)

insert #T(
     PART_ID 
	,ORDER_IBT_ID
	,[w1|T] ...
	,[w1|SS]
,...
--вплоть до 26
)
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
    ,...
--вплоть до 26
from ( blah-blah) a

update T set 
	[w27|T] = X.[w27|T]
    ,...
    --вплоть до конца
from #T T inner join
(
SELECT
	 PART_ID
	,[w27|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
    ,...
    --вплоть до конца
from ( blah-blah) a
) X
on X.PART_ID = T.PART_ID
Alexander2
Дата: 24.01.2013 12:24:53
aleks2 и Куренков,

спасибо,
P.S. (я не прошу работу за меня делать)
.....
мой ответ чемберленам:
сделано и поверено уже часа 2 назад до ваших сообщений
кусками код показываю, смысла целиком пастить нет

--Testing52
IF OBJECT_ID(N'tempdb..#TmpPlan13') IS NOT  NULL
DROP TABLE #TmpPlan13
CREATE TABLE #TmpPlan13
(
 PART_ID [varchar](30),
...
[w1|T] [int],
[w1|SS] [float],
[w1|Mon] [float],
[w1|Tue] [float],
[w1|Wed] [float],
[w1|Thu] [float],
[w1|Fri] [float],
[w2|T] [int],
[w2|SS] [float],
[w2|Mon] [float],
[w2|Tue] [float],
[w2|Wed] [float],
[w2|Thu] [float],
[w2|Fri] [float],
...
[w52|T] [int],
[w52|SS] [float], 
[w52|Mon] [float],
[w52|Tue] [float],
[w52|Wed] [float],
[w52|Thu] [float],
[w52|Fri] [float]
)

IF OBJECT_ID(N'tempdb..#My35') IS NOT  NULL
DROP TABLE #My35

CREATE TABLE [dbo].#My35(
	[PART_ID] [varchar](30) NULL,
	[ORDER_IBT_ID] [varchar](50) NULL,
	[w1|T] [int] NULL,
	[w1|SS] [int] NULL,
	[w1|Mon] [int] NULL,
	[w1|Tue] [int] NULL,
	[w1|Wed] [int] NULL,
	[w1|Thu] [int] NULL,
	[w1|Fri] [int] NULL,
....
	[w35|T] [int] NULL,
	[w35|SS] [int] NULL,
	[w35|Mon] [int] NULL,
	[w35|Tue] [int] NULL,
	[w35|Wed] [int] NULL,
	[w35|Thu] [int] NULL,
	[w35|Fri] [int] NULL
)

IF OBJECT_ID(N'tempdb..#My52') IS NOT  NULL
DROP TABLE #My52

CREATE TABLE [dbo].#My52(
	[PART_ID] [varchar](30) NULL,
	[ORDER_IBT_ID] [varchar](50) NULL,
	[w36|T] [int] NULL,
	[w36|SS] [int] NULL,
	[w36|Mon] [int] NULL,
	[w36|Tue] [int] NULL,
...
	[w52|T] [int] NULL,
	[w52|SS] [int] NULL,
	[w52|Mon] [int] NULL,
	[w52|Tue] [int] NULL,
	[w52|Wed] [int] NULL,
	[w52|Thu] [int] NULL,
	[w52|Fri] [int] NULL
)

Insert into #My35
SELECT
     distinct
	 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
...
    ,[w35|T]   = case when a.seq_week = (select seq_week + 34 from MyPERIODS where date < getdate() and getdate() < (date + 1)) and a.DayOfWeek = 'Tot' then PLANNED else 0 end
	,[w35|SS]  = case when a.seq_week = (select seq_week + 34 from MyPERIODS where date < getdate() and getdate() < (date + 1)) and a.DayOfWeek = 'WKN' then PLANNED else 0 end
	,[w35|Mon] = case when a.seq_week = (select seq_week + 34 from MyPERIODS where date < getdate() and getdate() < (date + 1)) and a.DayOfWeek = 'Mon' then PLANNED else 0 end
	,[w35|Tue] = case when a.seq_week = (select seq_week + 34 from MyPERIODS where date < getdate() and getdate() < (date + 1)) and a.DayOfWeek = 'Tue' then PLANNED else 0 end
	,[w35|Wed] = case when a.seq_week = (select seq_week + 34 from MyPERIODS where date < getdate() and getdate() < (date + 1)) and a.DayOfWeek = 'Wed' then PLANNED else 0 end
	,[w35|Thu] = case when a.seq_week = (select seq_week + 34 from MyPERIODS where date < getdate() and getdate() < (date + 1)) and a.DayOfWeek = 'Thu' then PLANNED else 0 end
	,[w35|Fri] = case when a.seq_week = (select seq_week + 34 from MyPERIODS where date < getdate() and getdate() < (date + 1)) and a.DayOfWeek = 'Fri' then PLANNED else 0 end
--____________________________________________
FROM
(blah-blah) a

insert into #My52

SELECT
     distinct 
	 PART_ID
	,ORDER_IBT_ID
    ,[w36|T]   = case when a.seq_week = (select seq_week + 35 from MyPERIODS where date < getdate() and getdate() < (date + 1)) and a.DayOfWeek = 'Tot' then PLANNED else 0 end
	,[w36|SS]  = case when a.seq_week = (select seq_week + 35 from MyPERIODS where date < getdate() and getdate() < (date + 1)) and a.DayOfWeek = 'WKN' then PLANNED else 0 end
	,[w36|Mon] = case when a.seq_week = (select seq_week + 35 from MyPERIODS where date < getdate() and getdate() < (date + 1)) and a.DayOfWeek = 'Mon' then PLANNED else 0 end
	,[w36|Tue] = case when a.seq_week = (select seq_week + 35 from MyPERIODS where date < getdate() and getdate() < (date + 1)) and a.DayOfWeek = 'Tue' then PLANNED else 0 end
	,[w36|Wed] = case when a.seq_week = (select seq_week + 35 from MyPERIODS where date < getdate() and getdate() < (date + 1)) and a.DayOfWeek = 'Wed' then PLANNED else 0 end
	,[w36|Thu] = case when a.seq_week = (select seq_week + 35 from MyPERIODS where date < getdate() and getdate() < (date + 1)) and a.DayOfWeek = 'Thu' then PLANNED else 0 end
	,[w36|Fri] = case when a.seq_week = (select seq_week + 35 from MyPERIODS where date < getdate() and getdate() < (date + 1)) and a.DayOfWeek = 'Fri' then PLANNED else 0 end
...
	,[w52|T]   = case when a.seq_week = (select seq_week + 51 from MyPERIODS where date < getdate() and getdate() < (date + 1)) and a.DayOfWeek = 'Tot' then PLANNED else 0 end
	,[w52|SS]  = case when a.seq_week = (select seq_week + 51 from MyPERIODS where date < getdate() and getdate() < (date + 1)) and a.DayOfWeek = 'WKN' then PLANNED else 0 end
	,[w52|Mon] = case when a.seq_week = (select seq_week + 51 from MyPERIODS where date < getdate() and getdate() < (date + 1)) and a.DayOfWeek = 'Mon' then PLANNED else 0 end
	,[w52|Tue] = case when a.seq_week = (select seq_week + 51 from MyPERIODS where date < getdate() and getdate() < (date + 1)) and a.DayOfWeek = 'Tue' then PLANNED else 0 end
	,[w52|Wed] = case when a.seq_week = (select seq_week + 51 from MyPERIODS where date < getdate() and getdate() < (date + 1)) and a.DayOfWeek = 'Wed' then PLANNED else 0 end
	,[w52|Thu] = case when a.seq_week = (select seq_week + 51 from MyPERIODS where date < getdate() and getdate() < (date + 1)) and a.DayOfWeek = 'Thu' then PLANNED else 0 end
	,[w52|Fri] = case when a.seq_week = (select seq_week + 51 from MyPERIODS where date < getdate() and getdate() < (date + 1)) and a.DayOfWeek = 'Fri' then PLANNED else 0 end
--____________________________________________
FROM
(blah-blah) a

IF OBJECT_ID(N'tempdb..#TmpPlan13') IS NOT NULL 
delete from #TmpPlan13

insert into #TmpPlan13

SELECT
 dem.PART_ID
...
,case when [w1|T] is null then 0 else [w1|T] end as [w1|T]
,case when [w1|SS]  is null then 0 else [w1|SS]  end as [w1|SS] 
,case when [w1|Mon] is null then 0 else [w1|Mon] end as [w1|Mon]
,case when [w1|Tue] is null then 0 else [w1|Tue] end as [w1|Tue]
,case when [w1|Wed] is null then 0 else [w1|Wed] end as [w1|Wed]
,case when [w1|Thu] is null then 0 else [w1|Thu] end as [w1|Thu]
,case when [w1|Fri] is null then 0 else [w1|Fri] end as [w1|Fri]
,case when [w2|T] is null then 0 else [w2|T] end as [w2|T]
...
,case when [w52|T]   is null then 0 else [w52|T]   end as [w52|T]
,case when [w52|SS]  is null then 0 else [w52|SS]  end as [w52|SS] 
,case when [w52|Mon] is null then 0 else [w52|Mon] end as [w52|Mon]
,case when [w52|Tue] is null then 0 else [w52|Tue] end as [w52|Tue]
,case when [w52|Wed] is null then 0 else [w52|Wed] end as [w52|Wed]
,case when [w52|Thu] is null then 0 else [w52|Thu] end as [w52|Thu]
,case when [w52|Fri] is null then 0 else [w52|Fri] end as [w52|Fri]

FROM
	[PRODUCTION_DEMAND] dem LEFT JOIN
(
SELECT
     distinct
	 PART_ID
        ,ORDER_IBT_ID
	,sum([w1|T])   as [w1|T]
	,sum([w1|SS] ) as [w1|SS] 
	,sum([w1|Mon]) as [w1|Mon]
	,sum([w1|Tue]) as [w1|Tue]
	,sum([w1|Wed]) as [w1|Wed]
	,sum([w1|Thu]) as [w1|Thu]
	,sum([w1|Fri]) as [w1|Fri]
...
	,sum([w52|T])   as [w52|T]
	,sum([w52|SS] ) as [w52|SS] 
	,sum([w52|Mon]) as [w52|Mon]
	,sum([w52|Tue]) as [w52|Tue]
	,sum([w52|Wed]) as [w52|Wed]
	,sum([w52|Thu]) as [w52|Thu]
	,sum([w52|Fri]) as [w52|Fri]
FROM
(
select 
distinct
 A.*
,B.[w36|T]  
,B.[w36|SS] 
,B.[w36|Mon]
,B.[w36|Tue]
,B.[w36|Wed]
,B.[w36|Thu]
,B.[w36|Fri]
...
,B.[w52|T]  
,B.[w52|SS] 
,B.[w52|Mon]
,B.[w52|Tue]
,B.[w52|Wed]
,B.[w52|Thu]
,B.[w52|Fri]
from dbo.#My35 A 
left join dbo.#My52 B on A.PART_ID=B.PART_ID and A.ORDER_IBT_ID=B.ORDER_IBT_ID
) b
GROUP BY
  PART_ID
,ORDER_IBT_ID
) c
	on dem.part_id = c.part_id and dem.order_ibt_id = c.order_ibt_id


Так сойдет? ;)
Cygapb-007
Дата: 24.01.2013 12:40:54
я бы слияние делал по full join:
;with
FullJoin as (
   select 
      isnull(A.PART_ID,B.PART_ID) PART_ID,
      isnull(A.ORDER_IBT_ID,B.ORDER_IBT_ID) ORDER_IBT_ID,
      A.[w1|SS], A.[w1|Mon], ..., B.[w52|Thu],B.[w52|Fri]
   from #my35 A
   full join #my52 B on A.PART_ID=B.PART_ID and A.ORDER_IBT_ID=B.ORDER_IBT_ID
   )
select *
FROM [PRODUCTION_DEMAND] dem 
left join FullJoin c on dem.part_id = c.part_id and dem.order_ibt_id = c.order_ibt_id
aleks2
Дата: 24.01.2013 12:54:21
Alexander2
aleks2

спасибо,
P.S. (я не прошу работу за меня делать)


1. Да не о тебе печемся. Тибя уже можно списать в утиль.
Неофитов жалко.

2. Не сойдет.