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

Откуда:
Сообщений: 24
SELECT vcName, MIN(CASE WHEN t.vcEvent = 'Начало_работы' THEN dEventTime ELSE NULL END) AS t1, 
MAX(CASE WHEN t.vcEvent = 'Конец_работы' THEN dEventTime ELSE NULL END) AS t2, 
(case when datediff(s, MIN(CASE WHEN t.vcEvent = 'Начало_работы' THEN dEventTime ELSE NULL END), 
MAX(CASE WHEN t.vcEvent = 'Конец_работы' THEN dEventTime ELSE NULL END)) < 0 then 'компьютер не выключался сутки до и после'


В результате имеем строку вида
pupkina 13.05.2013 9:38 13.05.2013 9:00 computer was not rebooted day before and after

Необходимо получить 2 строки
начало работы конец работы
pupkina 13.05.2013 9:38 computer was not rebooted day before
pupkina 13.05.2013 9:00 computer was not rebooted day after

Но при этом, чтобы выводилось 1 строка при корректной работе сотрудника
начало работы конец работы
pupkina 14.05.2013 9:38 14.05.2013 18:00

Вопрос в догонку отчет пишу из Borland Builder 6, выводится в exel. Проблема с кодировкой в запросе N'компьютер не выключался сутки до и после', пробывал прямо в строке и через переменную WideString, не отображает кириллицу.
16 май 13, 11:58    [14304396]     Ответить | Цитировать Сообщить модератору
 Re: Раздвоение строки, по условию  [new]
Glory
Member

Откуда:
Сообщений: 104751
ilya80let
В результате имеем строку вида
pupkina 13.05.2013 9:38 13.05.2013 9:00 computer was not rebooted day before and after

Приведите описание таблицы и пример данных
16 май 13, 13:48    [14305328]     Ответить | Цитировать Сообщить модератору
 Re: Раздвоение строки, по условию  [new]
ilya80let
Member

Откуда:
Сообщений: 24
имею исходную таблицу с полями:
vcName varchar(128), vcEvent varchar(128), dEventime типа datetime

Pupkin Начало работы 22.04.2013 9:00:54
Pupkin Конец работы 22.04.2013 16:40:12
Pupkin Конец работы 22.04.2013 18:00:14
Pupkin Начало работы 23.04.2013 10:56:11
Pupkin Конец работы 23.04.2013 18:00:00
16 май 13, 14:02    [14305423]     Ответить | Цитировать Сообщить модератору
 Re: Раздвоение строки, по условию  [new]
ilya80let
Member

Откуда:
Сообщений: 24
Если кому интересно решил проблему так,
выслушаю замечания
DECLARE @t TABLE (vcName VARCHAR(128),dt1 DATETIME, dt2 DATETIME, vt3 VARCHAR(128))

INSERT INTO @t
(
	vcName,
	dt1,dt2,vt3
)
SELECT vcName, MIN(CASE WHEN t.vcEvent = 'WorkUpTime' THEN dEventTime ELSE Null END) AS t1, 
MAX(CASE WHEN t.vcEvent = 'WorkDawnTime' THEN dEventTime ELSE Null END) AS t2, 
(case when datediff(s, MIN(CASE WHEN t.vcEvent = 'WorkUpTime' THEN dEventTime ELSE NULL END), MAX(CASE WHEN t.vcEvent = 'WorkDawnTime' THEN dEventTime ELSE NULL END)) < 0 then 'компьютер не выключался сутки до и после' else convert(varchar, convert(datetime, 
convert(varchar,datediff(s, MIN(CASE WHEN t.vcEvent = 'WorkUpTime' THEN dEventTime ELSE NULL END), MAX(CASE WHEN t.vcEvent = 'WorkDawnTime' THEN dEventTime ELSE NULL END))/3600) +':'+
convert(varchar,(datediff(s, MIN(CASE WHEN t.vcEvent = 'WorkUpTime' THEN dEventTime ELSE NULL END), MAX(CASE WHEN t.vcEvent = 'WorkDawnTime' THEN dEventTime ELSE NULL END))%3600)/60)), 8)end) as t3 
FROM UserName t where
t.dEventTime between '20130401' and '20130601'
GROUP BY vcName, CONVERT(VARCHAR(128), t.dEventTime, 104)

select vcName, (CASE WHEN m.t2 = 1 THEN t1 ELSE NULL END) AS t1,
(CASE WHEN m.t2 = 2 THEN t1 ELSE NULL END) AS t2,
'комп не выключался сутки до и после' t3
from
(select vcName, t.dt1 as t1, 1 t2
from (
SELECT * from @t m 
where datediff(s, m.dt1, m.dt2) < 0) t

union
select vcName, t8.dt2 as t2 , 2 dt1
 
from (
SELECT * from @t m
where datediff(s, m.dt1, m.dt2) < 0) t8
) m
union all
select * 
from (
SELECT * from @t m where m.vt3 not like 'компьютер не выключался сутки до и после' 
union all
SELECT * from @t m where m.vt3 is null
)
d 
order by vcName, t1
16 май 13, 17:57    [14307385]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить