данные в качестве столбцов
Добавлено: 25 дек 2008, 08:30
реально ли сделать так, чтобы данные из таблицы в результате запроса были столбцами? вроде пересечением или кросстабом называется такое. как бы это замутить на sql?
Форум по InterBase, Firebird и Yaffil
http://www.ibaseforum.ru/
спасибо за инфу) метод на клиенте в принципе устраивает, но стало интересно можно ли sql'м замутить это)WildSery писал(а):Поиском пробовал?
Если же ты упёртый, и стандартные методы (на клиенте) получения кросстаба не устраивают - есть и альтернативный способ.
нет)Gera писал(а):А количество столбцов зарание известно?
В чисто академических целях можно реализовать через EXECUTE STATEMENT, что-то вроде этого:но стало интересно можно ли sql'м замутить это)
Код: Выделить всё
CREATE TABLE COLS (COL_ID INT, COL_NAME VARCHAR(100)) -- значиения, преобразуемые в столбцы и их псевдонимы
CREATE TABLE VALS (COL_ID INT, ROW_ID INT, VALUE FLOAT) -- разворачиваемая таблица
INSERT INTO COLS VALUES (1, 'AAA')
INSERT INTO COLS VALUES (2, 'BBB')
INSERT INTO VALS VALUES (1,1,0.1)
INSERT INTO VALS VALUES (2,1,0.2)
INSERT INTO VALS VALUES (2,1,0.3)
INSERT INTO VALS VALUES (2,2,0.4)
EXECUTE BLOCK
DECLARE VARIABLE Par VARCHAR(32000), Col VARCHAR(32000), Sql VARCHAR(32000)
BEGIN
Par = ''
Col = ''
SELECT
:Col = :Col + ',SUM(CASE WHEN COL_ID=' + CAST(COL_ID AS VARCHAR) + N' THEN VALUE END) AS '+COL_NAME,
:Par = :Par + CAST(COL_ID AS VARCHAR) + ','
FROM COLS
Par = LEFT(:Par, LEN(:Par) - 1)
Sql = 'SELECT ROW_ID'+:Col+
'FROM VALS
WHERE COL_ID IN (' + :Par + ')
GROUP BY ROW_ID'
EXECUTE STATEMENT :SQL
END