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

Откуда:
Сообщений: 3
Прошу прощения за ламерский вопрос....

Есть запрос который возвращает данные:
как разделить agentTime на 'PlanTime' без создания вьюхи?

select u.last_name, round(sum(time_unit),0) as agentTime,COUNT(*) as count,
'PlanTime' =
case
WHEN month(st.create_time)=1 and YEAR(st.create_time)=2012 THEN 159*60
WHEN month(st.create_time)=2 and YEAR(st.create_time)=2012 THEN 168*60
WHEN month(st.create_time)=3 and YEAR(st.create_time)=2012 THEN 167*60
WHEN month(st.create_time)=4 and YEAR(st.create_time)=2012 THEN 159*60
WHEN month(st.create_time)=5 and YEAR(st.create_time)=2012 THEN 159*60
WHEN month(st.create_time)=6 and YEAR(st.create_time)=2012 THEN 151*60
WHEN month(st.create_time)=7 and YEAR(st.create_time)=2012 THEN 176*60
WHEN month(st.create_time)=8 and YEAR(st.create_time)=2012 THEN 175*60
WHEN month(st.create_time)=9 and YEAR(st.create_time)=2012 THEN 160*60
WHEN month(st.create_time)=10 and YEAR(st.create_time)=2012 THEN 184*60
WHEN month(st.create_time)=11 and YEAR(st.create_time)=2012 THEN 176*60
WHEN month(st.create_time)=12 and YEAR(st.create_time)=2012 THEN 167*60
WHEN month(st.create_time)=1 and YEAR(st.create_time)=2013 THEN 168*60
WHEN month(st.create_time)=2 and YEAR(st.create_time)=2013 THEN 160*60
WHEN month(st.create_time)=3 and YEAR(st.create_time)=2013 THEN 159*60
WHEN month(st.create_time)=4 and YEAR(st.create_time)=2013 THEN 183*60
WHEN month(st.create_time)=5 and YEAR(st.create_time)=2013 THEN 143*60
WHEN month(st.create_time)=6 and YEAR(st.create_time)=2013 THEN 143*60
WHEN month(st.create_time)=7 and YEAR(st.create_time)=2013 THEN 184*60
WHEN month(st.create_time)=8 and YEAR(st.create_time)=2013 THEN 167*60
WHEN month(st.create_time)=9 and YEAR(st.create_time)=2013 THEN 168*60
WHEN month(st.create_time)=10 and YEAR(st.create_time)=2013 THEN 184*60
WHEN month(st.create_time)=11 and YEAR(st.create_time)=2013 THEN 168*60
WHEN month(st.create_time)=12 and YEAR(st.create_time)=2013 THEN 175*60

END,
month(st.create_time) as mm,YEAR(st.create_time) as yy from otrs...time_accounting ta 
inner join otrs...ticket st on st.id=ta.id
inner join otrs...service s on s.id=st.service_id
inner join otrs...users u on u.id=st.change_by
where st.ticket_state_id in (2,3,4,10) and st.queue_id not in (3) 
group by u.last_name,month(st.create_time),YEAR(st.create_time) 
order by u.last_name,YEAR(st.create_time),month(st.create_time)


Сообщение было отредактировано: 30 янв 13, 15:59
30 янв 13, 15:23    [13851373]     Ответить | Цитировать Сообщить модератору
 Re: Как получить значение?  [new]
Glory
Member

Откуда:
Сообщений: 104751
elrengil
как разделить agentTime на 'PlanTime' без создания вьюхи?

Не создавать его ?
30 янв 13, 15:28    [13851412]     Ответить | Цитировать Сообщить модератору
 Re: Как получить значение?  [new]
elrengil
Member

Откуда:
Сообщений: 3
хочу добавить дополнительный столбик, чтобы в нем было значение agentTime/'PlanTime'
30 янв 13, 15:55    [13851673]     Ответить | Цитировать Сообщить модератору
 Re: Как получить значение?  [new]
Гость333
Member

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

select t.*, t.agentTime / t.PlanTime
from 
(
  ... тут ваш первоначальный запрос БЕЗ order by
) t
order by t.last_name, t.yy, t.mm
30 янв 13, 16:00    [13851710]     Ответить | Цитировать Сообщить модератору
 Re: Как получить значение?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
; with t as (

select u.last_name, round(sum(time_unit),0) as agentTime,COUNT(*) as count,
'PlanTime' =
case
WHEN month(st.create_time)=1 and YEAR(st.create_time)=2012 THEN 159*60
WHEN month(st.create_time)=2 and YEAR(st.create_time)=2012 THEN 168*60
WHEN month(st.create_time)=3 and YEAR(st.create_time)=2012 THEN 167*60
WHEN month(st.create_time)=4 and YEAR(st.create_time)=2012 THEN 159*60
WHEN month(st.create_time)=5 and YEAR(st.create_time)=2012 THEN 159*60
WHEN month(st.create_time)=6 and YEAR(st.create_time)=2012 THEN 151*60
WHEN month(st.create_time)=7 and YEAR(st.create_time)=2012 THEN 176*60
WHEN month(st.create_time)=8 and YEAR(st.create_time)=2012 THEN 175*60
WHEN month(st.create_time)=9 and YEAR(st.create_time)=2012 THEN 160*60
WHEN month(st.create_time)=10 and YEAR(st.create_time)=2012 THEN 184*60
WHEN month(st.create_time)=11 and YEAR(st.create_time)=2012 THEN 176*60
WHEN month(st.create_time)=12 and YEAR(st.create_time)=2012 THEN 167*60
WHEN month(st.create_time)=1 and YEAR(st.create_time)=2013 THEN 168*60
WHEN month(st.create_time)=2 and YEAR(st.create_time)=2013 THEN 160*60
WHEN month(st.create_time)=3 and YEAR(st.create_time)=2013 THEN 159*60
WHEN month(st.create_time)=4 and YEAR(st.create_time)=2013 THEN 183*60
WHEN month(st.create_time)=5 and YEAR(st.create_time)=2013 THEN 143*60
WHEN month(st.create_time)=6 and YEAR(st.create_time)=2013 THEN 143*60
WHEN month(st.create_time)=7 and YEAR(st.create_time)=2013 THEN 184*60
WHEN month(st.create_time)=8 and YEAR(st.create_time)=2013 THEN 167*60
WHEN month(st.create_time)=9 and YEAR(st.create_time)=2013 THEN 168*60
WHEN month(st.create_time)=10 and YEAR(st.create_time)=2013 THEN 184*60
WHEN month(st.create_time)=11 and YEAR(st.create_time)=2013 THEN 168*60
WHEN month(st.create_time)=12 and YEAR(st.create_time)=2013 THEN 175*60

END,
month(st.create_time) as mm,YEAR(st.create_time) as yy from otrs...time_accounting ta 
inner join otrs...ticket st on st.id=ta.id
inner join otrs...service s on s.id=st.service_id
inner join otrs...users u on u.id=st.change_by
where st.ticket_state_id in (2,3,4,10) and st.queue_id not in (3) 
group by u.last_name,month(st.create_time),YEAR(st.create_time) 


)
select
  t.*
  , agentTime / PlanTime
from t 
order by t.last_name, t.yy , t.mm
30 янв 13, 16:00    [13851714]     Ответить | Цитировать Сообщить модератору
 Re: Как получить значение?  [new]
elrengil
Member

Откуда:
Сообщений: 3
Огромное человеческое спасибо всем кто решил помочь!
30 янв 13, 16:55    [13852098]     Ответить | Цитировать Сообщить модератору
 Re: Как получить значение?  [new]
RESEARCH
Member

Откуда:
Сообщений: 187
Cоздай отдельную таблицу PlanTime

month,year, time заполни ее значениями

потом просто делай

select ...,,pt.plantime from..

left join plantime p on p.month=month and p.year=year
30 янв 13, 19:25    [13852893]     Ответить | Цитировать Сообщить модератору
 Re: Как получить значение?  [new]
Cygapb-007
Member

Откуда:
Сообщений: 1677
declare @plan table (yyyymm int identity(/*2012*12+01-1=*/ 24144,1),value float);
insert @plan values 
   (159*60),(168*60),(167*60),(159*60),(159*60),(151*60),(176*60),(175*60),
   (160*60),(184*60),(176*60),(167*60),(168*60),(160*60),(159*60),(183*60),
   (143*60),(143*60),(184*60),(167*60),(168*60),(184*60),(168*60),(175*60);
-- SELECT p.yyyymm, p.yyyymm%12+1 mm, yyyymm/12 yyyyy, p.value FROM @plan p order by p.yyyymm

select u.last_name, round(sum(time_unit),0) as agentTime,COUNT(*) as count,
'PlanTime' = p.value,/*
case
WHEN month(st.create_time)=1 and YEAR(st.create_time)=2012 THEN 159*60
WHEN month(st.create_time)=2 and YEAR(st.create_time)=2012 THEN 168*60
WHEN month(st.create_time)=3 and YEAR(st.create_time)=2012 THEN 167*60
WHEN month(st.create_time)=4 and YEAR(st.create_time)=2012 THEN 159*60
WHEN month(st.create_time)=5 and YEAR(st.create_time)=2012 THEN 159*60
WHEN month(st.create_time)=6 and YEAR(st.create_time)=2012 THEN 151*60
WHEN month(st.create_time)=7 and YEAR(st.create_time)=2012 THEN 176*60
WHEN month(st.create_time)=8 and YEAR(st.create_time)=2012 THEN 175*60
WHEN month(st.create_time)=9 and YEAR(st.create_time)=2012 THEN 160*60
WHEN month(st.create_time)=10 and YEAR(st.create_time)=2012 THEN 184*60
WHEN month(st.create_time)=11 and YEAR(st.create_time)=2012 THEN 176*60
WHEN month(st.create_time)=12 and YEAR(st.create_time)=2012 THEN 167*60
WHEN month(st.create_time)=1 and YEAR(st.create_time)=2013 THEN 168*60
WHEN month(st.create_time)=2 and YEAR(st.create_time)=2013 THEN 160*60
WHEN month(st.create_time)=3 and YEAR(st.create_time)=2013 THEN 159*60
WHEN month(st.create_time)=4 and YEAR(st.create_time)=2013 THEN 183*60
WHEN month(st.create_time)=5 and YEAR(st.create_time)=2013 THEN 143*60
WHEN month(st.create_time)=6 and YEAR(st.create_time)=2013 THEN 143*60
WHEN month(st.create_time)=7 and YEAR(st.create_time)=2013 THEN 184*60
WHEN month(st.create_time)=8 and YEAR(st.create_time)=2013 THEN 167*60
WHEN month(st.create_time)=9 and YEAR(st.create_time)=2013 THEN 168*60
WHEN month(st.create_time)=10 and YEAR(st.create_time)=2013 THEN 184*60
WHEN month(st.create_time)=11 and YEAR(st.create_time)=2013 THEN 168*60
WHEN month(st.create_time)=12 and YEAR(st.create_time)=2013 THEN 175*60

END,*/
month(st.create_time) as mm,YEAR(st.create_time) as yy 

from otrs...time_accounting ta 
inner join otrs...ticket st on st.id=ta.id
inner join otrs...service s on s.id=st.service_id
inner join otrs...users u on u.id=st.change_by
inner join @plan p on p.yyyymm=YEAR(st.create_time)*100+MONTH(st.create_time)-1
where st.ticket_state_id in (2,3,4,10) and st.queue_id not in (3) 
group by u.last_name,month(st.create_time),YEAR(st.create_time) 
order by u.last_name,YEAR(st.create_time),month(st.create_time)
30 янв 13, 20:00    [13852999]     Ответить | Цитировать Сообщить модератору
 Re: Как получить значение?  [new]
Cygapb-007
Member

Откуда:
Сообщений: 1677
эхх... как поправить в желтом YEAR*12+MONTH-1 ? :)
30 янв 13, 20:01    [13853002]     Ответить | Цитировать Сообщить модератору
 Re: Как получить значение?  [new]
RESEARCH
Member

Откуда:
Сообщений: 187
inner join @plan p on p.yyyymm=YEAR(st.create_time)*100+MONTH(st.create_time)-1


это слишком сложно по моему мнению

лучше так

-- ОДИН РАЗ СОЗДАЕМ ТАБЛИЦУ, ОНА БУДЕТ РАСШИРЯТЬСЯ НА БУДУЩИЕ ГОДА
CREATE TABLE PLANTIME (YR INT, MON INT, VALUE INT)
INSERT INTO PLANTIME VALUES (2012,1,159)
INSERT INTO PLANTIME VALUES (2012,2,163)
INSERT INTO PLANTIME VALUES (2012,3,167)
...

select u.last_name, round(sum(time_unit),0) as agentTime,COUNT(*) as count,
'PlanTime' = p.value*60
left join PLANTIME p on P.YR=YEAR(st.create_time) AND P.MON=MONTH(st.create_time)-1
30 янв 13, 20:30    [13853116]     Ответить | Цитировать Сообщить модератору
 Re: Как получить значение?  [new]
Cygapb-007
Member

Откуда:
Сообщений: 1677
Ну не знаю... Для разовых параметров заводить постоянную таблицу...
Небольшое уточнение к переменной:
declare @plan table (
   yyyymm int identity(/*2012*12+01-1=*/ 24144,1) primary key,
   value float, 
   month as yyyymm%12+1, year as yyyymm/12);
-- SELECT p.yyyymm, p.month, p.year, p.value/60 FROM @plan p order by p.yyyymm
30 янв 13, 20:49    [13853204]     Ответить | Цитировать Сообщить модератору
 Re: Как получить значение?  [new]
RESEARCH
Member

Откуда:
Сообщений: 187
declare @plan table (
   yyyymm int identity(/*2012*12+01-1=*/ 24144,1) primary key,
   value float, 
   month as yyyymm%12+1, year as yyyymm/12);


вот это кул !
30 янв 13, 21:39    [13853382]     Ответить | Цитировать Сообщить модератору
 Re: Как получить значение?  [new]
Александр Бердышев
Member

Откуда: Санкт-Петербург
Сообщений: 400
Cygapb-007
Ну не знаю... Для разовых параметров заводить постоянную таблицу...
Небольшое уточнение к переменной:
declare @plan table (
   yyyymm int identity(/*2012*12+01-1=*/ 24144,1) primary key,
   value float, 
   month as yyyymm%12+1, year as yyyymm/12);
-- SELECT p.yyyymm, p.month, p.year, p.value/60 FROM @plan p order by p.yyyymm


Судя по коду, тенденция к новым значениям для новых дат сохранится.
Значит необходимо создать таблицу-справочник.
Я сделал бы не 3 поля, а 2
(вместо 2-х интовых - 1 smalldatetime, 1 поле - значение)

Потом, по мере появления новых параметров, меняющихся из месяца в месяц, в эту таблицу можно добавлять новые поля.
4 фев 13, 16:14    [13873335]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить