Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Наличие и отсутствие статуса  [new]
Mitresky
Member

Откуда: Раменское
Сообщений: 52
Такой вопрос. Есть 2 таблицы. Документы(хранится номер док, дата создания, регистрации и так далее) и статистика, где хранится все что делалось с документами (Переход на статусы с черновик на действующий, с действующий на доработка и дата перехода).

Мы делаем выборку по дате регистрации (т.е. задаем период). и нам нужно определить, был ли данный документ на определенном статусе в статистике. Если был, то берем дату перехода на статус, если не был на данном статусе то "-" (без кавычек)

CASE не получиться, так как в статистике могут быть куча статусов. Пытался с WITH, тоже не то.

Киньте пару идей. Может кто сталкивался с таким.
18 фев 13, 11:15    [13941410]     Ответить | Цитировать Сообщить модератору
 Re: Наличие и отсутствие статуса  [new]
Glory
Member

Откуда:
Сообщений: 104751
Используйте корелированный подзапрос, например.
18 фев 13, 11:17    [13941433]     Ответить | Цитировать Сообщить модератору
 Re: Наличие и отсутствие статуса  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
Mitresky,

Непойму по описанию в чем проблема, помоему обычный left join в паре с case.
18 фев 13, 11:17    [13941435]     Ответить | Цитировать Сообщить модератору
 Re: Наличие и отсутствие статуса  [new]
aleks2
Guest
WarAnt
Mitresky,

Непойму по описанию в чем проблема, помоему обычный left join в паре с case.

Можна даже без CASE - isnull обойтись.
18 фев 13, 11:40    [13941590]     Ответить | Цитировать Сообщить модератору
 Re: Наличие и отсутствие статуса  [new]
Добрый Э - Эх
Guest
Mitresky
Киньте пару идей. Может кто сталкивался с таким.
Кинь пару строк исходных данных и желаемый результат (в виде упомянутого тобою же WITH), не только идей накидают, но и готовых запросов.
18 фев 13, 12:08    [13941772]     Ответить | Цитировать Сообщить модератору
 Re: Наличие и отсутствие статуса  [new]
Mitresky
Member

Откуда: Раменское
Сообщений: 52
Добрый Э - Эх
Mitresky
Киньте пару идей. Может кто сталкивался с таким.
Кинь пару строк исходных данных и желаемый результат (в виде упомянутого тобою же WITH), не только идей накидают, но и готовых запросов.


Это первоначальный вариант:
SELECT
       CAST ([Тема] AS VARCHAR(128)) AS [Тема]
      ,CONVERT(NVARCHAR(10),[Дата регистрации],104) AS DateReg
      ,CONVERT(NVARCHAR(10),S.[дата перевода на статус],104) AS DateStatus
      ,CAST (CASE
                 WHEN S.[Код статуса]='330' THEN CONVERT(NVARCHAR(10),S.[дата перевода на статус],104)
                     ELSE ' '
                      END AS NVARCHAR(10)) AS Vremya
      ,S.[Код статуса] AS [Код статуса]
FROM [Документ] P WITH(NOLOCK)
JOIN [Статистика] S WITH(NOLOCK)
     ON S.[IDs]=P.ID
WHERE Дата регистрации BETWEEN @Дата начала AND @Дата конца 


Пока пытаюсь сделать по вышесказанным советам. Но буду рад, если поможешь..
18 фев 13, 12:27    [13941902]     Ответить | Цитировать Сообщить модератору
 Re: Наличие и отсутствие статуса  [new]
aleks2
Guest
SELECT
       CAST ([Тема] AS VARCHAR(128)) AS [Тема]
      ,CONVERT(NVARCHAR(10),S0.[Дата регистрации],104) AS DateReg
      ,CONVERT(NVARCHAR(10),S.[дата перевода на статус],104) AS DateStatus
      , isnull( CONVERT(NVARCHAR(10), S.[дата перевода на статус], 104), '' ) AS Vremya
      ,S.[Код статуса] AS [Код статуса]
FROM [Документ] P WITH(NOLOCK)
JOIN (select * from [Статистика] WHERE [Код статуса]='???регистрация' ) S0 WITH(NOLOCK)
     ON S0.[IDs]=P.ID
left outer JOIN (select * from [Статистика] WHERE [Код статуса]='330' ) S WITH(NOLOCK)
     ON S.[IDs]=P.ID
WHERE S0.[Дата регистрации] BETWEEN @Дата начала AND @Дата конца 


тока вот ЭТО фуфло работать не может
WHERE Дата регистрации BETWEEN @Дата начала AND @Дата конца 
18 фев 13, 12:40    [13941963]     Ответить | Цитировать Сообщить модератору
 Re: Наличие и отсутствие статуса  [new]
Добрый Э - Эх
Guest
Mitresky,

Запрос не надо.
Надо тестовые данные (пару строк из таблицы с документами, с десяток строк из таблицы со статусами) и желаемый результат на этих данных.
18 фев 13, 12:44    [13941988]     Ответить | Цитировать Сообщить модератору
 Re: Наличие и отсутствие статуса  [new]
Добрый Э - Эх
Guest
Может тебе вообще пивот нужен?
Чтобы на выходе таблица имела вид:

Документ Регистрация Черновик Доработка Действующий
1 01.01.2013 02.01.2013 03.01.2013 04.01.2013
2 03.01.2013 04.01.2013 - 05.01.2013
18 фев 13, 12:51    [13942066]     Ответить | Цитировать Сообщить модератору
 Re: Наличие и отсутствие статуса  [new]
Mitresky
Member

Откуда: Раменское
Сообщений: 52
Добрый Э - Эх
Mitresky,

Запрос не надо.
Надо тестовые данные (пару строк из таблицы с документами, с десяток строк из таблицы со статусами) и желаемый результат на этих данных.


Таблица документы:
ID Тема дата регистрации
1 Док1 01.07.2012
2 Док2 07.07.2012
3 Док3 10.07.2012
4 Док4 10.07.2012


Статистика
ID Дата перехода на статус Статус
1 10.08.2012 330
1 12.08.2012 110
1 15.08.2012 230
1 17.08.2012 555
2 02.08.2012 120
2 07.08.2012 330
2 09.08.2012 130
3 10.07.2012 20
3 11.07.2012 30
3 12.07.2012 40
4 01.07.2012 0



Выходные данные
ID Тема дата регистрации Дата перехода на статус
1 Док1 01.07.2012 10.08.2012
2 Док2 07.07.2012 07.08.2012
3 Док3 10.07.2012 -
4 Док4 10.07.2012 -
18 фев 13, 13:17    [13942297]     Ответить | Цитировать Сообщить модератору
 Re: Наличие и отсутствие статуса  [new]
Mitresky
Member

Откуда: Раменское
Сообщений: 52
aleks2
SELECT
       CAST ([Тема] AS VARCHAR(128)) AS [Тема]
      ,CONVERT(NVARCHAR(10),S0.[Дата регистрации],104) AS DateReg
      ,CONVERT(NVARCHAR(10),S.[дата перевода на статус],104) AS DateStatus
      , isnull( CONVERT(NVARCHAR(10), S.[дата перевода на статус], 104), '' ) AS Vremya
      ,S.[Код статуса] AS [Код статуса]
FROM [Документ] P WITH(NOLOCK)
JOIN (select * from [Статистика] WHERE [Код статуса]='???регистрация' ) S0 WITH(NOLOCK)
     ON S0.[IDs]=P.ID
left outer JOIN (select * from [Статистика] WHERE [Код статуса]='330' ) S WITH(NOLOCK)
     ON S.[IDs]=P.ID
WHERE S0.[Дата регистрации] BETWEEN @Дата начала AND @Дата конца 


тока вот ЭТО фуфло работать не может
WHERE Дата регистрации BETWEEN @Дата начала AND @Дата конца 





JOIN (select * from [Статистика] WHERE [Код статуса]='???регистрация' ) S0 WITH(NOLOCK)
     ON S0.[IDs]=P.ID
- это тут для чего?? А именное
WHERE [Код статуса]='???регистрация' )
18 фев 13, 13:18    [13942314]     Ответить | Цитировать Сообщить модератору
 Re: Наличие и отсутствие статуса  [new]
Mitresky
Member

Откуда: Раменское
Сообщений: 52
И ещё, только что узнал.., статус может быть возвращен на доработку. Например, был статус 330, затем перевели на 110 и снова скинули на 330. Так тут нужно брать дату самую свежую, при статусе 330
18 фев 13, 13:48    [13942550]     Ответить | Цитировать Сообщить модератору
 Re: Наличие и отсутствие статуса  [new]
Гость333
Member

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

set dateformat dmy;

declare @Документы  table (ID int, Тема varchar(100), [Дата регистрации] datetime);
insert @Документы
select 1, 'Док1', '01.07.2012' union all
select 2, 'Док2', '07.07.2012' union all
select 3, 'Док3', '10.07.2012' union all
select 4, 'Док4', '10.07.2012';

declare @Статистика table (ID int, [Дата перехода на статус] datetime, Статус int);
insert @Статистика
select 1, '10.08.2012', 330 union all
select 1, '12.08.2012', 110 union all
select 1, '15.08.2012', 230 union all
select 1, '17.08.2012', 555 union all
select 2, '02.08.2012', 120 union all
select 2, '07.08.2012', 330 union all
select 2, '09.08.2012', 130 union all
select 3, '10.07.2012', 20 union all
select 3, '11.07.2012', 30 union all
select 3, '12.07.2012', 40 union all
select 4, '01.07.2012', 0;
-- Вот так трудно было вышестоящее создание и наполнение таблиц выложить в виде скрипта, а не csv-таблички?

select d.ID, d.Тема, convert(char(10), d.[Дата регистрации], 104) as [Дата регистрации],
       isnull(convert(char(10), x.[Дата перехода на статус], 104), '-') as [Дата перехода на статус]
from @Документы d
     outer apply
     (   select top(1) c.[Дата перехода на статус]
         from @Статистика c
         where c.ID = d.ID and c.Статус = 330
         order by c.[Дата перехода на статус] desc
     ) x
18 фев 13, 14:06    [13942737]     Ответить | Цитировать Сообщить модератору
 Re: Наличие и отсутствие статуса  [new]
aleks2
Guest
Mitresky

[/src] - это тут для чего?? А именное
WHERE [Код статуса]='???регистрация' )

Эээ, дарагой, фсе экстрасенсы и телепаты поувольнялися....
18 фев 13, 14:09    [13942759]     Ответить | Цитировать Сообщить модератору
 Re: Наличие и отсутствие статуса  [new]
aleks2
Guest
Гость333
     outer apply

Нафега?

set dateformat dmy;

declare @Документы  table (ID int, Тема varchar(100), [Дата регистрации] datetime);
insert @Документы
select 1, 'Док1', '01.07.2012' union all
select 2, 'Док2', '07.07.2012' union all
select 3, 'Док3', '10.07.2012' union all
select 4, 'Док4', '10.07.2012';

declare @Статистика table (ID int, [Дата перехода на статус] datetime, Статус int);
insert @Статистика
select 1, '10.08.2012', 330 union all
select 1, '12.08.2012', 110 union all
select 1, '15.08.2012', 230 union all
select 1, '17.08.2012', 555 union all
select 2, '02.08.2012', 120 union all
select 2, '07.08.2012', 330 union all
select 2, '09.08.2012', 130 union all
select 3, '10.07.2012', 20 union all
select 3, '11.07.2012', 30 union all
select 3, '12.07.2012', 40 union all
select 4, '01.07.2012', 0;
-- Вот так трудно было вышестоящее создание и наполнение таблиц выложить в виде скрипта, а не csv-таблички?

select d.ID, d.Тема, convert(char(10), d.[Дата регистрации], 104) as [Дата регистрации],
       isnull(convert(char(10), c.[Дата перехода на статус], 104), '-') as [Дата перехода на статус]
from @Документы d 
     left outer join
     ( select ID, max([Дата перехода на статус]) as [Дата перехода на статус] from @Статистика where Статус = 330 group by ID ) as c
     on c.ID = d.ID 
--WHERE d.[Дата регистрации] BETWEEN @Дата начала AND @Дата конца 
18 фев 13, 14:17    [13942826]     Ответить | Цитировать Сообщить модератору
 Re: Наличие и отсутствие статуса  [new]
Гость333
Member

Откуда:
Сообщений: 3683
aleks2
Гость333
     outer apply

Нафега?

Дык, захотелось. ТС же дал все скрипты для создания таблиц, я увидел там индекс по (ID, Статус, [Дата перехода на статус]) — при этом outer apply будет работать так же, как ваш left join :-)
18 фев 13, 14:30    [13942926]     Ответить | Цитировать Сообщить модератору
 Re: Наличие и отсутствие статуса  [new]
Mitresky
Member

Откуда: Раменское
Сообщений: 52
Гость333
Mitresky,

set dateformat dmy;

declare @Документы  table (ID int, Тема varchar(100), [Дата регистрации] datetime);
insert @Документы
select 1, 'Док1', '01.07.2012' union all
select 2, 'Док2', '07.07.2012' union all
select 3, 'Док3', '10.07.2012' union all
select 4, 'Док4', '10.07.2012';

declare @Статистика table (ID int, [Дата перехода на статус] datetime, Статус int);
insert @Статистика
select 1, '10.08.2012', 330 union all
select 1, '12.08.2012', 110 union all
select 1, '15.08.2012', 230 union all
select 1, '17.08.2012', 555 union all
select 2, '02.08.2012', 120 union all
select 2, '07.08.2012', 330 union all
select 2, '09.08.2012', 130 union all
select 3, '10.07.2012', 20 union all
select 3, '11.07.2012', 30 union all
select 3, '12.07.2012', 40 union all
select 4, '01.07.2012', 0;
-- Вот так трудно было вышестоящее создание и наполнение таблиц выложить в виде скрипта, а не csv-таблички?

select d.ID, d.Тема, convert(char(10), d.[Дата регистрации], 104) as [Дата регистрации],
       isnull(convert(char(10), x.[Дата перехода на статус], 104), '-') as [Дата перехода на статус]
from @Документы d
     outer apply
     (   select top(1) c.[Дата перехода на статус]
         from @Статистика c
         where c.ID = d.ID and c.Статус = 330
         order by c.[Дата перехода на статус] desc
     ) x




С небольшими доработками данного скрипта сделал. Спасибо Всем кто откликнулся на помощь.
18 фев 13, 14:30    [13942929]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить