Транспонирование таблицы
Транспонирование таблицы
Есть ли способ динамически формировать запрос, который бы имел в виде столбцов значения полей одной таблицы, а строками были бы значения из другой таблицы?
Кросс-запросы формируются совсем другими инструментами. Например, это отчётник какой-нибудь, типа Fast Report.
Колонки - клиенты, строки - товары, пересечение - сумма или количество. Да сколько угодно примеров.А зачем вам такое извращение? Приведите пример с обоснованием.
Последний раз редактировалось WildSery 26 июн 2006, 16:35, всего редактировалось 1 раз.
Есть надобность (у заказчика) видеть набор данных, в котором после каждой фамилии идет количество акций разных типов, т.е. набор данных должен выглядеть так:
ФИО, кол-во акций типа 1, ... кол-во акций типа N
Есть таблицы владельцев, акций и привязки акций. Здесь N - количество типов акций у эмитента.
ФИО, кол-во акций типа 1, ... кол-во акций типа N
Есть таблицы владельцев, акций и привязки акций. Здесь N - количество типов акций у эмитента.
Так у тебя еще количество типов разное? Получается, еще саму форму отчета динамически строишь... Сходу я бы сделал так: два цикла в двух датасетах по эмитентам и типам акций. В третий передаешь в качестве параметров условия отбора по эмитенту и типу. На выходе получаешь количество акций. Полученные данные скармливаешь отчету. Коряво конечно, есть варианты и лучше, но надо думать.zenja писал(а):Есть надобность (у заказчика) видеть набор данных, в котором после каждой фамилии идет количество акций разных типов, т.е. набор данных должен выглядеть так:
ФИО, кол-во акций типа 1, ... кол-во акций типа N
Есть таблицы владельцев, акций и привязки акций. Здесь N - количество типов акций у эмитента.
А никак нельзя количество типов акций сделать стабальным? То есть их всего пять или шесть и т.д. И это число не изменяется.
Тебе же нужен способ формировать запрос? Тогда легко:
1. Создаешь и открываешь SQLTypeAction (TIBSQL) с запросом select id from type_action с сортировкой по id (выбираем все типы акций).
2. Создаешь датасет для сетки.
3. Генерируем запрос.
Протестируй только. Я с головы писал. Но логика именно такая.
1. Создаешь и открываешь SQLTypeAction (TIBSQL) с запросом select id from type_action с сортировкой по id (выбираем все типы акций).
2. Создаешь датасет для сетки.
3. Генерируем запрос.
Код: Выделить всё
DataSet.SelectSQL.Add('SELECT');
DataSet.SelectSQL.Add(' C.ID,');
while not SQLTypeAction.EOF do
DataSet.SelectSQL.Add(' (SELECT COUNT(*) FROM ACT_CLIENT WHERE (ID_CLIENT = C.ID_CLIENT) AND (ID_TYPE_ACTION = ' + SQLTypeAction.FieldByName('ID').AsString + ')),';
DataSet.SelectSQL.Add(' C.NAME');
DataSet.SelectSQL.Add('FROM');
DataSet.SelectSQL.Add(' CLIENT C');
DataSet.SelectSQL.Add('ORDER BY');
DataSet.SelectSQL.Add(' NAME');
Никогда не применяй решения, работоспособность которых зависит от подобных факторов. Вон, сам Б. Гейтс заявлял, что "640 кб хватит всем". И где теперь эти 640 кб? Может, пройдет пару лет, и 10 мало будет. Потом 20... Тогда как код через дин. формирование select'а будет работать всегда.zenja писал(а):Конечно же не может. Но если описать выходных переменных штук эдак 10 (из расчета, что самое большое количество динамических столбцов будет 8-9), то очень даже можно.
Только не очень красиво...
-
- Сообщения: 44
- Зарегистрирован: 26 окт 2004, 14:30
Вот как заявленная задача решалась на MSSQL2005
Таблицы:
Можно посидеть полчасика и перенести на FB
Думаю идея понятна.
Таблицы:
Код: Выделить всё
Parameter(
CODE VARCHAR(25),
NAME VARCHAR(100))
Account_Parameter(
ID_Account INT,
Parameter VARCHAR(25), --ссылка на Parameter.Code
Float_Value Float)
Код: Выделить всё
DECLARE @Par NVARCHAR(MAX), @Col NVARCHAR(MAX)
SET @Par = N''
SET @Col = N''
DECLARE @Sql NVARCHAR(MAX)
SELECT
@Col = @Col + N',SUM(CASE WHEN Parameter=''' + Code + N''' THEN Float_Value END) AS ['+Name+N']',
@Par = @Par + N''''+ Code + N''','
FROM Parameter
WHERE ...
SET @Par = LEFT(@Par, LEN(@Par) - 1)
SET @Sql = N'SELECT ID_Account,'+@Col+
N'FROM Account_Parameter
WHERE Parameter IN (' + @Par+ N')
GROUP BY ID_Account'
EXEC SP_EXECUTESQL @SQL
Думаю идея понятна.