Можно ли развернуть данные из 2 стлб. табл. как массив MxN?

Николай
Дата: 01.03.2001 12:24:39
Приветствую!
Есть таблица t1(sct_id, top_id).
Есть др. тбл. t2(sct_id, cnt).
Возник вопрос:
можно ли получить t1 и t2 в виде:
cnt(sct_id, top_id), т.е. в виде массива, по одному измерению которого были бы top_id, по другому - sct_id, а на их пересечениях - соответствующее значение cnt?

!!!ЗАДАЧА заключается в том, что мне необходимо заполнить таблицы таким образом, чтобы не было бы различных sct_id, в которых состав top_id был бы одинаков.
Glory
Дата: 01.03.2001 13:09:40
Насколько я понял, то называется это Cross-Tab Query и одним запросом на сервере это можно сделать если заранее известно количество столбцов. Вроде такого запроса
SELECT t1.sct_id,
CASE t1.top_id=1 THEN t2.cnt ELSE 0 END AS R1,
CASE t1.top_id=2 THEN t2.cnt ELSE 0 END AS R2,
CASE t1.top_id=3 THEN t2.cnt ELSE 0 END) AS R3,.......
FROM t1 INNER JOIN t2 ON t2.sct_id = t1.sct_id
ORDER BY t1.sct_id

Из клиентских приложений Cross-Tab Query точно реализованы в Access-е.
SergSuper
Дата: 01.03.2001 14:11:53
2 Николай
А не могли бы Вы это показать как-нибудь на примере? Со значениями таблиц?
Потому что то что Вы хотите (если я правильно понял) делается как
select sct_id, top_id, count(*) cnt
from t1
group by sct_id, top_id

Но наверное задача несколько сложнее
Николай
Дата: 01.03.2001 17:20:35
СПАСИБО ЗА CROSS-TAB QUERY! Я еще не знал про такую возможность!

А задачу свою по удалению записей из t1, где в связанных с ней записях в t2 одинаковый набор значений полей я все-таки решил!

-----=====***** УДАЛЕНИЕ ПОВТОРЯЮЩИХСЯ ПЕРЕСЕЧЕНИЙ ТВР *****=====------
-- СОЗДАНИЕ КУРСОРА
DECLARE c_sct CURSOR
GLOBAL SCROLL KEYSET
FOR
select distinct sct_id from intrsct
-- ОТКРЫТИЕ КУРСОРА
OPEN c_sct
-- РАБОТА С КУРСОРОМ
if @@cursor_rows > 1
BEGIN
-- определение переменных --
declare @i1 int
declare @i2 int
declare @cnt int
declare @r1 int
declare @r2 int
declare @sct1 int
declare @sct2 int
declare @t_cnt1 int
declare @t_cnt2 int
set @cnt = @@cursor_rows
set @r1 = 1
set @r2 = 2
-- процесс --
print '@cnt= '+convert(char(3),@cnt)
print '---------'
while (@r1<@cnt)
BEGIN
print '@r1 = '+convert(char(3),@r1)
while (@r2<=@cnt)
BEGIN
fetch absolute @r1 from c_sct into @sct1
fetch absolute @r2 from c_sct into @sct2

set @t_cnt1 = (select count(distinct top_id) from intrsct_top where sct_id=@sct1)
set @t_cnt2 = (select count(distinct top_id) from intrsct_top where sct_id=@sct2)
if (@t_cnt1=@t_cnt2) and ((select count(distinct top_id) from intrsct_top where sct_id in (@sct1, @sct2)) = @t_cnt1)
begin
-- удаление дублирующихся записей--
print '@r1 = '+convert(char(3),@r1)+' |@r2 = '+convert(char(3),@r2)+' deleted !'
delete from intrsct where sct_id = @sct2
delete from intrsct_top where sct_id = @sct2
end
-- else
SET @r2 = @r2+1
END
SET @r1 = @r1+1
SET @r2 = @r1+1
END
END--if
-- ЗАКРЫТИЕ КУРСОРА
CLOSE c_sct
-- УДАЛЕНИЕ КУРСОРА
DEALLOCATE c_sct
SergSuper
Дата: 01.03.2001 18:04:42
трудно понять что у вас написано, но попробуйте написать это же без курсоров и у вас будет раз в 5 короче
(на 99% уверен что это можно)