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

Откуда: Москва-Лимассол
Сообщений: 241
Есть табличка1:
комната1, работник1, читать, 10часов
комната1, работник1, писать, 1 час
комната1, работник2, читать, 32,3часа
комната1, работник2, писать, 4,3часа
комната1, работник2, сидеть, 2,5 часа
комната1, работник3, смотреть, 6,0 часов
комната1, работник3, читать, 6,0 часов
комната1, работник3, писать, 16,0 часов
комната1, работник3, сидеть, 6,0 часов

есть табличка-справичник действий:
читать
писать
сидеть
смотреть

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

Вывод:
комната1, работник1, читать, 10часов
комната1, работник1, писать, 1 час
комната1, работник1, сидеть, 0 часов - добавили строку
комната1, работник1, смотреть, 0 часов - добавили строку
комната1, работник2, читать, 32,3часа
комната1, работник2, писать, 4,3часа
комната1, работник2, сидеть, 2,5 часа
комната1, работник2, сидеть, 0 часов - добавили строку
комната1, работник3, смотреть, 6,0 часов
комната1, работник3, читать, 6,0 часов
комната1, работник3, писать, 16,0 часов
комната1, работник3, сидеть, 6,0 часов

Чтоб у каждого работника было одинаковое количество строк, равное количеству строк в справочнике.


Я попробовал через декартово произведение (коряво получилось) с последующим self join:
with myt as (select distinct t1.* , t2.action as action2 from t1,t2 )
select t1.room, t1.employee, t1.action, 0 as t1.hours from myt t1, myt t2 where t1.room = t2.room and t1.employee = t2.employee and t1.action != t2.action2
union
select t1.* from myt t1, myt t2 where t1.room = t2.room and t1.employee = t2.employee and t1.action = t2.action2



Может как-то через оконные фунцкии можно решить? Может как-то можо более красиво решить?

Заранее благодарю! ))
11 ноя 16, 23:53    [19885240]     Ответить | Цитировать Сообщить модератору
 Re: Объединить две таблицы с размножением строк  [new]
_human
Member

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

не проверял
;with sol as 
(
	select room, employee, action, hours
	from t1
	
	union all
	
	select room, employee, t2.action, 0 as hours
	from t1
		cross join t2
)
	
select room, empoyee, action, max(hours) as hours
from sol
group by room, empoyee, action

;with des as 
(

	select room, employee, t2.action
	from t1
		cross join t2
)

select t1.room, t1.employee, d.action, ISNULL(t1.hours, 0) as hours
from des d
	left join t1 on d.room = t1.room and d.employee = t1.employee and d.action = t1.action
12 ноя 16, 01:13    [19885376]     Ответить | Цитировать Сообщить модератору
 Re: Объединить две таблицы с размножением строк  [new]
andrey odegov
Member

Откуда:
Сообщений: 473
maxski,
with a as(
 select *
 from(values
  (N'комната1',N'работник1',N'читать',10.),
  (N'комната1',N'работник1',N'писать',1.),
  (N'комната1',N'работник2',N'читать',32.3),
  (N'комната1',N'работник2',N'писать',4.3),
  (N'комната1',N'работник2',N'сидеть',2.5),
  (N'комната1',N'работник3',N'смотреть',6.),
  (N'комната1',N'работник3',N'читать',6.),
  (N'комната1',N'работник3',N'писать',16.),
  (N'комната1',N'работник3',N'сидеть',6.))t(p,w,a,d)
),b as(
 select *
 from(values
  (N'читать'),
  (N'писать'),
  (N'сидеть'),
  (N'смотреть'))t(a)
),c as(
 select distinct a.p,a.w,b.a from a cross join b
)
select
 c.p,c.w,c.a,coalesce(a.d,0.)d
from c
left join a
 on c.p=a.p and c.w=a.w and c.a=a.a;
12 ноя 16, 07:34    [19885492]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить