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

Откуда:
Сообщений: 8
Добрый день.

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

Нужен такой отчет, строки - клиенты, столбцы -дни, на пересечение- количество часов. в качестве параметра ответственный

Отчет обращается к хранимой процедуре, которая должна посчитать количество часов.
Ответственный, клиент, дата (но не день), количество часов , тип работы хранятся в одной таблице.

Если в один и тот же день один и тоже ответственный работал на несколько клиентов с типом работы равным значение1 или значение2 (конкретные 2 строковых значения), то необходимо сложить количество часов и разделить между клиентами.
3 сен 09, 13:51    [7613029]     Ответить | Цитировать Сообщить модератору
 Re: Хранимая процедура  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
Tate
столбцы -дни
то есть за год будет 366 столбцов в отчете?
3 сен 09, 13:54    [7613047]     Ответить | Цитировать Сообщить модератору
 Re: Хранимая процедура  [new]
Tate
Member

Откуда:
Сообщений: 8
Паганель
Tate
столбцы -дни
то есть за год будет 366 столбцов в отчете?


э-не.. хочу в отчете период задавать
3 сен 09, 13:56    [7613058]     Ответить | Цитировать Сообщить модератору
 Re: Хранимая процедура  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
Tate
э-не.. хочу в отчете период задавать
Хорошо
Юзер задал период, равный одному году
В отчете будет 366 столбцов?
3 сен 09, 13:58    [7613062]     Ответить | Цитировать Сообщить модератору
 Re: Хранимая процедура  [new]
Tate
Member

Откуда:
Сообщений: 8
если я правильно понимаю, то хранимая процедура возвращает что-то вроде таблицы , а дальше с ней можно работать как обычно..я RSS отчеты имею ввиду....
3 сен 09, 13:58    [7613067]     Ответить | Цитировать Сообщить модератору
 Re: Хранимая процедура  [new]
Tate
Member

Откуда:
Сообщений: 8
По умолчанию будет месяц ,т.е. 30 -31 столбцов
3 сен 09, 13:59    [7613073]     Ответить | Цитировать Сообщить модератору
 Re: Хранимая процедура  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
Tate
По умолчанию будет месяц ,т.е. 30 -31 столбцов

Вообще-то 28-29-30-31

Можно ли сделать следующее:
1) Чтобы клиент всегда заставлял юзера выбирать именно месяц (т.е. не по умолчанию, а обязательно)
2) Чтобы сервер выдавал клиенту всегда 31 столбцов дней, а клиент просто не отображал "лишние" столбцы
?
3 сен 09, 14:05    [7613114]     Ответить | Цитировать Сообщить модератору
 Re: Хранимая процедура  [new]
Tate
Member

Откуда:
Сообщений: 8
Паганель
Tate
По умолчанию будет месяц ,т.е. 30 -31 столбцов

Вообще-то 28-29-30-31

Можно ли сделать следующее:
1) Чтобы клиент всегда заставлял юзера выбирать именно месяц (т.е. не по умолчанию, а обязательно)
2) Чтобы сервер выдавал клиенту всегда 31 столбцов дней, а клиент просто не отображал "лишние" столбцы
?


Думаю, можно задавать Дату Начала и прибавлять к ней, к примеру 20 дней.. если нужно дальше, то соответственно меняем дату начала...
Просто, мне очень сложно представить, как это все посчитать в процедуре, т.к. я их первый раз в глаза вижу..
3 сен 09, 14:08    [7613139]     Ответить | Цитировать Сообщить модератору
 Re: Хранимая процедура  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
вот для трех дней вариант, до 20 доделаете сами
-- test data
declare @t table(ответственный varchar(10), клиент varchar(10)
   ,дата smalldatetime, часов decimal(5, 2), тип varchar(10))
insert into @t(ответственный, клиент, дата, часов, тип)
select 'Ivanov', 'Olga',    '20090903', 3, 'значение1' union all
select 'Ivanov', 'Natalya', '20090903', 5, 'значение2' union all
select 'Ivanov', 'Elena',   '20090903', 9, 'значение3' union all
select 'Ivanov', 'Olga',    '20090904', 4, 'значение1' union all
select 'Ivanov', 'Natalya', '20090904', 6, 'значение2' union all
select 'Ivanov', 'Natalya', '20090903', 1, 'значение3' union all
select 'Ivanov', 'Olga',    '20090905', 5, 'значение1' union all
select 'Ivanov', 'Natalya', '20090905', 7, 'значение2' union all
select 'Petrov', 'Olga',    '20090905', 5, 'значение1' union all
select 'Petrov', 'Natalya', '20090905', 7, 'значение2'

declare @Ответственный varchar(10), @ДатаНачала smalldatetime
select @Ответственный = 'Ivanov', @ДатаНачала = '20090903'
-- end of test data

set ansi_warnings off

;with prepared as (
   select клиент
         ,datediff(dd, @ДатаНачала, дата) + 1 as день
         ,case when тип in ('значение1', 'значение2')
               then avg (case when тип in ('значение1', 'значение2')
                              then часов
                              else null
                          end) over(partition by дата)
               else часов
            end as часов
     from @t
    where ответственный = @Ответственный
      and дата >= @ДатаНачала
      and дата < dateadd(dd, 21, @ДатаНачала)
)
select клиент, [1], [2], [3]
  from prepared
 pivot (sum(часов) for день in ([1], [2], [3])) as p

set ansi_warnings on

клиент     1                                       2                                       3
---------- --------------------------------------- --------------------------------------- ---------------------------------------
Elena      9.000000                                NULL                                    NULL
Natalya    5.000000                                5.000000                                6.000000
Olga       4.000000                                5.000000                                6.000000

(3 row(s) affected)
уф, столько требований... надеюсь, я правильно понял про деление часов
3 сен 09, 14:39    [7613326]     Ответить | Цитировать Сообщить модератору
 Re: Хранимая процедура  [new]
Tate
Member

Откуда:
Сообщений: 8
Ого.. Спасибо Вам Огромное!!!!
3 сен 09, 14:41    [7613336]     Ответить | Цитировать Сообщить модератору
 Re: Хранимая процедура  [new]
Tate
Member

Откуда:
Сообщений: 8
Можно вопрос, как можно преобразовать тип дата\время в дата..в таблице дата с временем хранится...
3 сен 09, 14:50    [7613420]     Ответить | Цитировать Сообщить модератору
 Re: Хранимая процедура  [new]
DENIS_CHEL
Member

Откуда:
Сообщений: 23097
DECLARE @d datetime

SET @d=getdate()

SELECT @d

SELECT @d=cast(@d AS varchar(8))

SELECT @d

?
3 сен 09, 14:54    [7613447]     Ответить | Цитировать Сообщить модератору
 Re: Хранимая процедура  [new]
Tate
Member

Откуда:
Сообщений: 8
Спасибо
3 сен 09, 14:55    [7613465]     Ответить | Цитировать Сообщить модератору
 Re: Хранимая процедура  [new]
DENIS_CHEL
Member

Откуда:
Сообщений: 23097
Tate
Спасибо


Простите, я вас нечаянно обманул....

DECLARE @d datetime

SET @d=getdate()

SELECT @d


SET @d=CONVERT(varchar(8), @d, 112)

SELECT @d
3 сен 09, 15:08    [7613545]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить