Spłaszczenie danych i zapis bitowy

0

Cześć, mam takie dane:

employeeID | tID
----------------
    10     |  1
    11     |  1
    11     |  2

Zakładając, że tID to cyfra z zakresu <1,8>, chcę uzyskać coś takiego(kolumna tIDs została pokazana w postaci bitowej):

employeeID | tIDs
----------------------
    10     | 10000000
    11     | 11000000

Czyli każdy bit odpowiada odpowiedniej wartości tID.
Kolumna tIDs będzie oczywiście typu TINYINT, napisałem tak, żeby lepiej wyjaśnic o co mi chodzi.

Próbuję stworzyć zapytanie, które da mi takie dane, ale w żaden sposób mi to nie idzie. Ma ktoś jakiś pomysł?

0

No i? chcesz bitowe OR zrobić na poziomie bazy grupując po employeeID.
CTE i do przodu :)

declare @t table (id int, x tinyint);

insert into @t values (10, 1);
insert into @t values (11, 1);
insert into @t values (11, 2);
insert into @t values (11, 3);
insert into @t values (11, 4);


with B (eid, nr, x) as
(
	select id, ROW_NUMBER() over (partition by id order by id) as nr, x from @t
),
C (eid, nr, bitsum) as
(
	select eid, nr, x from B where nr = 1
	union all
	select B.eid, B.nr, B.x | C.bitsum as bitsum from C 
	inner join B on C.eid = B.eid and B.nr = C.nr + 1 
)
select C.eid, C.bitsum from C
inner join (select eid, MAX(nr) as maxNr from C group by eid) as D on C.eid = D.eid and C.nr = D.maxNr
0

http://biblog.pl/?p=140 hint: custom aggregate function

0

Massther - nie wiem, co za dane dostaję, ale zupełnie inne niż powinienem.
MisiekD - nie ma innej opcji, tylko pisać własną funkcję agregującą?

[DOPISANE]

OK, wymyśliłem prostszy sposób, może nie tak elegancki jak propozycja Miśka, ale na moje potrzeby wystarczy:

select employeeID, (max(bits & 1) + max(bits & 2)+max(bits & 4) + max(bits & 8) + max(bits & 16)
	 + max(bits & 32) + max(bits & 64) + max(bits & 128)) as tIDs
from
(
    select distinct employeeID, typeID, (128 / power(2, typeID-1)) as bits
    from tab
) as a
group by employeeID

1 użytkowników online, w tym zalogowanych: 0, gości: 1