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

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

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


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

К сообщению приложен файл (KBD vsksys.sql - 16Kb) cкачать
24 янв 13, 11:51    [13820438]     Ответить | Цитировать Сообщить модератору
 Re: Как развернуть таблицу на 52 недели, преодолев лимит 256 таблиц в query  [new]
aleks2
Guest
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
24 янв 13, 12:02    [13820527]     Ответить | Цитировать Сообщить модератору
 Re: Как развернуть таблицу на 52 недели, преодолев лимит 256 таблиц в query  [new]
Alexander2
Member

Откуда: Calgary
Сообщений: 1167
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


Так сойдет? ;)
24 янв 13, 12:24    [13820681]     Ответить | Цитировать Сообщить модератору
 Re: Как развернуть таблицу на 52 недели, преодолев лимит 256 таблиц в query  [new]
Cygapb-007
Member

Откуда:
Сообщений: 1677
я бы слияние делал по 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
24 янв 13, 12:40    [13820804]     Ответить | Цитировать Сообщить модератору
 Re: Как развернуть таблицу на 52 недели, преодолев лимит 256 таблиц в query  [new]
aleks2
Guest
Alexander2
aleks2

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


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

2. Не сойдет.
24 янв 13, 12:54    [13820922]     Ответить | Цитировать Сообщить модератору
 Re: Как развернуть таблицу на 52 недели, преодолев лимит 256 таблиц в query  [new]
Ennor Tiegael
Member

Откуда:
Сообщений: 3422
Alexander2
Так сойдет? ;)
Итого, вам потребуется 5 разных объявлений для этой, с позволения сказать, таблицы, т.к. первым рабочим днем года может быть любой из дней недели с Пн по Пт. В россии вообще любой, в т.ч. и Вс, но в Калгари, наверное, пяти все-таки достаточно.
Плюс год может быть високосным, т.е. разное кол-во столбцов. Итого 10 вариантов. Круто, не знал, что Калгари уже в Индии
24 янв 13, 13:50    [13821378]     Ответить | Цитировать Сообщить модератору
 Re: Как развернуть таблицу на 52 недели, преодолев лимит 256 таблиц в query  [new]
Alexander2
Member

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

специально чукчам-писателям посвящается:
надо иногда читать и смотреть исходные данные, прежде чем искать черную кошку в черной комнате? когда ее там нет.
Подсказка: смотри таблицу MyPeriods.
24 янв 13, 19:28    [13823769]     Ответить | Цитировать Сообщить модератору
 Re: Как развернуть таблицу на 52 недели, преодолев лимит 256 таблиц в query  [new]
Cygapb-007
Member

Откуда:
Сообщений: 1677
кстати,
case when [w1|SS]  is null then 0 else [w1|SS]  end as [w1|SS]
равносильно
isnull([w1|SS],0) as [w1|SS]
24 янв 13, 19:38    [13823819]     Ответить | Цитировать Сообщить модератору
 Re: Как развернуть таблицу на 52 недели, преодолев лимит 256 таблиц в query  [new]
Alexander2
Member

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

пасиб, это разумею, оптимизирую.
Осталось добавить 39 реакций (код писать) на OnChange новых полей в результирующем датасете на клиенте. Плюс onGetCellParams немного усложнится за счет добавочных условий (для раскраски ячеек).
А так....железяка работает от 8-12 секунд на производственной базе.
24 янв 13, 19:49    [13823875]     Ответить | Цитировать Сообщить модератору
 Re: Как развернуть таблицу на 52 недели, преодолев лимит 256 таблиц в query  [new]
Cygapb-007
Member

Откуда:
Сообщений: 1677
	,[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
бррр....
может так?
create function get_planned(
   @DayOfWeek char(3), @DOWcheck char(3), 
   @seq_week datetime, @period int,
   @now date,
   @planned float) 
returns float as
-- grant execute to public
begin
   declare @week int
   if @DayOfWeek = @DOWcheck begin
      select top(1) @week=seq_week 
         from MyPERIOD 
         -- where getdate() between date and date+1
         where @now between date and date+1
      if @seq_week = @week+@period
         return(@planned)
   end
   return(0.0)
end
GO
declare @now date=getdate()
...
	,[w36|SS]  = dbo.get_planned(a.DayOfWeek, 'WKN', a.seq_week, 35, @now, PLANNED)
24 янв 13, 20:32    [13824047]     Ответить | Цитировать Сообщить модератору
 Re: Как развернуть таблицу на 52 недели, преодолев лимит 256 таблиц в query  [new]
Cygapb-007
Member

Откуда:
Сообщений: 1677
   @seq_week datetimeint, @period int,
24 янв 13, 20:46    [13824107]     Ответить | Цитировать Сообщить модератору
 Re: Как развернуть таблицу на 52 недели, преодолев лимит 256 таблиц в query  [new]
Glory
Member

Откуда:
Сообщений: 104751
Alexander2
сделано и поверено уже часа 2 назад до ваших сообщений
кусками код показываю, смысла целиком пастить нет

Может расскажите, в чем великий смысл запроса к MyPERIODS в каждом case, вместо одноразового join-а ?
24 янв 13, 21:00    [13824158]     Ответить | Цитировать Сообщить модератору
 Re: Как развернуть таблицу на 52 недели, преодолев лимит 256 таблиц в query  [new]
Alexander2
Member

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

в корень зришь! Уважаю!
Я уже думал насчет того, чтобы заменить ЭТОТ повторяющийся кусок функцией, только руки не дошли.

Меня больше беспокоит клиентская часть теперь. В топике есть скриншот грида.
Там есть такой функционал:
- вначале она показывает все T колонки (Total за неделю)
- при клике на T делаются видимыми/невидимыми 6 колонок кликнутой недели
вот паскалевский код:
procedure TForm1.grdPlanTitleBtnClick(Sender: TObject; ACol: Integer;  Column: TColumnEh);
  var i: integer;
  SL : TStringList;
  sDir : string;
begin
   CurrentColumnN:=ACol;

   if (Column.Field.Index = 0)
    then
     begin
      myPvisible:= not myPvisible;
      For i:=1 to 3 do grdPlan.Columns[i].Visible:=myPvisible;
     end
    else
     if (Column.Field.Index = 14)   //в подобных блоках обрабатываются колонки дней недели
      then
       begin
        myOvisible:= not myOvisible;
        For i:=15 to 19 do grdPlan.Columns[i].Visible:=myOvisible;
       end
      else
       if (Column.Field.Index = 23)
        then
         begin
          myvisible1:= not myvisible1;
          For i:=24 to 29 do grdPlan.Columns[i].Visible:=myvisible1;
         end
        else
         if (Column.Field.Index = 30)
          then
           begin
            myvisible2:= not myvisible2;
            For i:=31 to 36 do grdPlan.Columns[i].Visible:=myvisible2;
           end
          else
...

я подозреваю, должен быть лимит вложенных else, а мне надо обеспечить 52 if условия.
24 янв 13, 21:01    [13824162]     Ответить | Цитировать Сообщить модератору
 Re: Как развернуть таблицу на 52 недели, преодолев лимит 256 таблиц в query  [new]
Alexander2
Member

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

автор
Может расскажЕте, в чем великий смысл запроса к MyPERIODS в каждом case, вместо одноразового join-а ?
(так мелочь, не в обиду ;) )

Cygapb-007 (честь и хвала!) уже завернул частично потворяющийся кусок в функцию, спасибо огромное. Ессно, надо было давно превратить в функцию.

Дело в том, что одним джойном не обойтись - там же меняется смещение seq_week + ##
Так что придется каждый раз на соответcтвующий case дергать ЭТУ новоиспеченную функцию.
24 янв 13, 21:10    [13824191]     Ответить | Цитировать Сообщить модератору
 Re: Как развернуть таблицу на 52 недели, преодолев лимит 256 таблиц в query  [new]
Glory
Member

Откуда:
Сообщений: 104751
Alexander2
Дело в том, что одним джойном не обойтись - там же меняется смещение seq_week + ##

И что мешает как раз это смещение вычислять в case ?
24 янв 13, 21:11    [13824197]     Ответить | Цитировать Сообщить модератору
 Re: Как развернуть таблицу на 52 недели, преодолев лимит 256 таблиц в query  [new]
Alexander2
Member

Откуда: Calgary
Сообщений: 1167
Glory,
автор
И что мешает как раз это смещение вычислять в case ?

Хмм...так-так... что-то в этом есть... пока недотумкиваю
делать ОДИН джойн, в котором вызывать функцию, так?....что-то не то...
24 янв 13, 21:20    [13824216]     Ответить | Цитировать Сообщить модератору
 Re: Как развернуть таблицу на 52 недели, преодолев лимит 256 таблиц в query  [new]
Cygapb-007
Member

Откуда:
Сообщений: 1677
Glory
Alexander2
сделано и поверено уже часа 2 назад до ваших сообщений
кусками код показываю, смысла целиком пастить нет

Может расскажите, в чем великий смысл запроса к MyPERIODS в каждом case, вместо одноразового join-а ?
опс..
это я в лужу сел...
24 янв 13, 21:22    [13824224]     Ответить | Цитировать Сообщить модератору
 Re: Как развернуть таблицу на 52 недели, преодолев лимит 256 таблиц в query  [new]
Glory
Member

Откуда:
Сообщений: 104751
Alexander2
делать ОДИН джойн, в котором вызывать функцию, так

Какую еще функцию ?
24 янв 13, 21:22    [13824225]     Ответить | Цитировать Сообщить модератору
 Re: Как развернуть таблицу на 52 недели, преодолев лимит 256 таблиц в query  [new]
Alexander2
Member

Откуда: Calgary
Сообщений: 1167
никто в лужу не сел...
тут не так все просто с кондачка

Cygapb-007 предлагает эту ср...нь
,[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|SS]  = dbo.get_planned(a.DayOfWeek, 'WKN', a.seq_week, 35, @now, PLANNED)

вроде, все разумно и оптимистично выглядит, разве не так, Glory?

а как это еще круче оптимизировать то?
24 янв 13, 21:28    [13824241]     Ответить | Цитировать Сообщить модератору
 Re: Как развернуть таблицу на 52 недели, преодолев лимит 256 таблиц в query  [new]
Cygapb-007
Member

Откуда:
Сообщений: 1677
Cygapb-007
Glory
пропущено...

Может расскажите, в чем великий смысл запроса к MyPERIODS в каждом case, вместо одноразового join-а ?
опс..
это я в лужу сел...
	,[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


declare @seq_week int
select top(1) @seq_week=seq_week from MyPERIODS where getdate() between date and date+1
...
	,[w35|Tue] = case when a.seq_week = @seq_week + 34 and a.DayOfWeek = 'Tue' then PLANNED else 0 end
24 янв 13, 21:28    [13824242]     Ответить | Цитировать Сообщить модератору
 Re: Как развернуть таблицу на 52 недели, преодолев лимит 256 таблиц в query  [new]
Alexander2
Member

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

прошу для корректности заменить в моем посте цитаты кода на такие, а то я накосячил при копировании.

	,[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|SS]  = dbo.get_planned(a.DayOfWeek, 'WKN', a.seq_week, 35, @now, PLANNED)


и удалить этот пост.
24 янв 13, 21:33    [13824255]     Ответить | Цитировать Сообщить модератору
 Re: Как развернуть таблицу на 52 недели, преодолев лимит 256 таблиц в query  [new]
Glory
Member

Откуда:
Сообщений: 104751
Alexander2
вроде, все разумно и оптимистично выглядит, разве не так, Glory?

Именно, что выглядит.
24 янв 13, 21:35    [13824261]     Ответить | Цитировать Сообщить модератору
 Re: Как развернуть таблицу на 52 недели, преодолев лимит 256 таблиц в query  [new]
Alexander2
Member

Откуда: Calgary
Сообщений: 1167
Glory,
автор
Именно, что выглядит.


ну в каждой строке заменить вызов
,[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|SS]  = dbo.get_planned(a.DayOfWeek, 'WKN', a.seq_week, 35, @now, PLANNED)


именно это же в моем случае "разворачивает" таблицу на указанное число колонок.
24 янв 13, 21:40    [13824272]     Ответить | Цитировать Сообщить модератору
 Re: Как развернуть таблицу на 52 недели, преодолев лимит 256 таблиц в query  [new]
Cygapb-007
Member

Откуда:
Сообщений: 1677
не надо функцию! ну затупил под вечер, бывает.. надо так: 13824242
24 янв 13, 21:41    [13824276]     Ответить | Цитировать Сообщить модератору
 Re: Как развернуть таблицу на 52 недели, преодолев лимит 256 таблиц в query  [new]
Glory
Member

Откуда:
Сообщений: 104751
Alexander2
именно это же в моем случае "разворачивает" таблицу на указанное число колонок.

И где тут join ?
24 янв 13, 21:41    [13824277]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3 4   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить